数据类型
- string
- String(x) 将x转换为string类型
- x.toString() 将x转换为string类型,数字也可以
- number
- 整数,小数,NaN
- Number(x) 转为数字
如果传入空,空格返回0,
boolean,false=0,true=1
其他非法字符串返回NaN
日期对象Number(new Date()) 相同于 new Date().getTime(); - parseFloat()
- paseInt()
- 对象前加上符号+可转换为数字,无法转换时返回NaN,如var n = + "2.2";
- 其他数字运算
5 + null = 5
"5" + 1 = "51"
"5" - 1 = 4
- boolean
- function
- object
- null
- Date
- Array
- Obejct
- symbol
- undefined
- 判断是不是undefined注意使用引号 typeof obj === 'undefined'
- if(typeof obj === 'undeifned' || obj === null) {//dosth}
使用 typeof obj
使用 obj.constructor
- NaN 的数据类型是 number
- 数组(Array)的数据类型是 object
- 日期(Date)的数据类型为 object
- null 的数据类型是 object
- 未定义变量的数据类型为 undefined
正则表达式
Regular Expression
语法:
/正则表达式主体/修饰符(可选)
- i: 忽略大小写
- g: 全局扫描,不加时,匹配到第一个就停止
- m: 多行匹配
方法
- search()
用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置 - replace()
用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
使用 RegExp 对象
/e/.方法("The best things in life are free!")
- test()
- 返回true如果匹配到
- exec()
- 返回匹配到的数组
debugger;
语句可以打断点
异常处理
js中异常处理语法同java,
1。区别是catch中参数无需指定异常类型,因此也没有多catch块
2。throw 可以是任何对象
严格模式(use strict)
"use strict";
可以在脚本第一行,也可以在函数体第一行声明
验证表单
通过html中的onsubmit return一个方法,方法返回false来阻止表单提交
<form name="myForm" action="demo_form.php" onsubmit="return validateForm()" method="post">
名字: <input type="text" name="inputName">
<input type="submit" value="提交">
</form>
function validateForm() {
var x = document.forms["myForm"]["inputName"].value;
//数字验证if (isNaN(x) || x < 1 || x > 10) {
if (x == null || x == "") {
alert("需要输入名字。");
return false;
}
}
html事件
onblur
onclick
onerror
onfocus
onkeydown
onkeypress
onkeyup
onmouseover
onload
onmouseup
onmousedown
onsubmit
显式函数绑定
在 JavaScript 严格模式(strict mode)下, 在调用函数时第一个参数会成为 this 的值, 即使该参数不是一个对象。
在 JavaScript 非严格模式(non-strict mode)下, 如果第一个参数的值是 null 或 undefined, 它将使用全局对象替代。
apply 和 call
call() 和 apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身
通过 call() 或 apply() 方法你可以设置 this 的值, 且作为已存在对象的新方法调用。
允许切换函数执行的上下文环境(context),即 this 绑定的对象
var person1 = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
var person2 = {
firstName:"John",
lastName: "Doe",
}
person1.fullName.call(person2); // 返回 "John Doe"
常用对象及方法
- window
- document
- location
- navigator
- console
- history
- on...
js 操作 json
- json字符串->js对象
var obj = JSON.parse(jsonStr);
- js对象->json字符串
var jsonStr = JSON.stringify(obj)
json 语法
- 数据为 键/值 对,(json字符串中键用双引号,值数字,布尔可以不用引号)
- 数据由逗号分隔
- 大括号保存对象
- 方括号保存数组
javascript:void(0)
void: 指定要计算一个表达式但是不返回值
void func()
javascript:void func()
//or
void(func())
javascript:void(func())
//点击以后不会发生任何事
<a href="javascript:void(0)">单击此处什么也不会发生</a>
<a href="javascript:undefined">单击此处什么也不会发生</a>
//点击链接后显示警告信息
<a href="javascript:void(alert('Warning!!!'))">点我!</a>
//a 为 undefined,
// 不管传入什么表达式,或函数,被void包装一下,返回结果为undefined
var a = void(3);
//href="#"
//# 包含了一个位置信息,默认的锚是#top 也就是网页的上端
<a href="javascript:void(0);">点我没有反应的!</a>
<a href="#pos">点我定位到指定位置!</a>
js 多线程
回调
这个函数执行之后会产生一个子线程,子线程会等待 3 秒,然后执行回调函数
主线程不会阻塞
setTimeout(method, 3000);
异步 ajax
XMLHttpRequest
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
var xhr = new XMLHttpRequest();
xhr.onload = function () {
// 输出接收到的文字数据
document.getElementById("demo").innerHTML=xhr.responseText;
}
xhr.onerror = function () {
document.getElementById("demo").innerHTML="请求出错";
}
// 发送异步 GET 请求
xhr.open("GET", "https://www.runoob.com/try/ajax/ajax_info.txt", true);
xhr.send();
jquery
$.get("https://www.runoob.com/try/ajax/demo_test.php",function(data,status){
alert("数据: " + data + "\n状态: " + status);
});
new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("First");
resolve();
}, 1000);
}).then(function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("Second");
resolve();
}, 4000);
});
}).then(function () {
setTimeout(function () {
console.log("Third");
}, 3000);
});
Promise
//该方法返回一个 Promise
function print(delay, message) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log(message);
resolve();
}, delay);
});
}
//然后用不同的时间间隔输出了三行文本
print(1000, "First").then(function () {
return print(4000, "Second");
}).then(function () {
print(3000, "Third");
});
//将这段代码变得更好看
//异步函数 async function 中可以使用 await 指令,await 指令后必须跟着一个 Promise,异步函数会在这个 Promise 运行中暂停,直到其运行结束再继续运行
async function asyncFunc() {
await print(1000, "First");
await print(4000, "Second");
await print(3000, "Third");
}
asyncFunc();
//处理异常的机制将用 try-catch 块实现
async function asyncFunc() {
try {
await new Promise(function (resolve, reject) {
throw "Some error"; // 或者 reject("Some error")
});
} catch (err) {
console.log(err);
// 会输出 Some error
}
}
asyncFunc();
js 函数
typeof 操作符判断函数类型将返回 "function"
但是JavaScript 函数描述为一个对象更加准确
JavaScript 函数有 属性 和 方法
arguments.length 属性返回函数调用过程接收到的参数个数
函数对象的toString() 方法将返回一个字符串
函数即可以成为对象的属性,也可以是对象的方法
JavaScript 函数对参数的值没有进行任何的检查
函数显式参数(Parameters,形参)与隐式参数(Arguments,实参)
- 函数显式参数在函数定义时列出
- 函数隐式参数在函数调用时传递给函数真正的值。
- 函数定义显式参数时没有指定数据类型
- 函数对隐式参数没有进行类型检测
- 函数对隐式参数的个数没有进行检测
函数在调用时未提供隐式参数,参数会默认设置为: undefined
this 关键字
函数作为对象方法调用,会使得 this 的值成为对象本身
obj.fun();//this绑定到obj
使用 new fun() 调用函数,此时this不绑定任何值,对象被创建this为新的对象
es6 可以这样检查入参
如果y已经定义 , y || 返回 y, 因为 y 是 true, 否则返回 0, 因为 undefined 为 false
function myFunction(x, y) {
y = y || 5;
return x * y;
}
let res = myFunction(4);//20
如果函数调用时设置了过多的参数,参数将无法被引用,因为无法找到对应的参数名。 只能使用 arguments 对象来调用
arguments是数组,通过arguments.length获取长度,通过arguments[i]获取元素
//ES6 支持函数带有默认参数,就判断 undefined 和 || 的操作
function myFunction(x, y = 10) {
// y is 10 if not passed or undefined
return x + y;
}
myFunction(0, 2) // 输出 2
myFunction(5); // 输出 15, y 参数的默认值
函数声明
声明函数不需要结尾,不需要调用前声明,会自动提升
function functionName(parameters) { }
函数表达式
函数存储在变量中,不需要函数名称,通常通过变量名来调用,
需要分号结尾,并且需要在调用前声明。
var x = function (a, b) {return a * b};
构造函数
不推荐使用,不推荐new
var myFunction = new Function("a", "b", "return a * b");
自调用函数
通过括号包裹函数,并使用参数列表括号来调用
实际上是一个 匿名自我调用的函数 (没有函数名)
(function () { alert("Hello");})();
箭头函数
since es6
箭头函数是不能提升的,所以需要在使用之前定义
箭头函数会默认帮我们绑定外层 this 的值
使用 const 比使用 var 更安全,因为函数表达式始终是一个常量
const x = (x, y) => x * y;
(参数1, 参数2, …, 参数N) => { 函数声明 }
当函数体只有一条语句,可以省略大括号,和return关键字,该条语句将作为函数的返回值
当只有一个参数时,圆括号可省略
内嵌函数与闭包
变量 add 指定了函数自我调用的返回字值。
自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。
add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。
这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。
计数器受匿名函数的作用域保护,只能通过 add 方法修改。闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。
直观的说就是形成一个不销毁的栈环境。
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();//自调用,返回内部函数,外部函数无法引用(保护)
add();//1
add();//2
add();//3
js 操作HTML DOM (文档对象模型)
能够改变页面中的所有 HTML 元素,属性, CSS 样式,
能够对页面中的所有事件做出反应
查找多元素转数组方法htmlcollection -> Array
Array.prototype.slice.apply/call(y)
Array.prototype.slice.bind(y)()
获取dom元素
getElementById
getElementsByTagName
getElementsByClassName
改变dom内容
document.write
innerHTML
改变属性
直接当做js对象处理
.name="xxx";
改变样式
.style.property=新样式
document.getElementById("p2").style.color="blue";
事件处理
当网页已加载时
当用户点击鼠标时
当图像已加载时
当鼠标移动到元素上时
当输入字段被改变时
当提交 HTML 表单时
当用户触发按键时
// 用户进入或离开页面时
// onload 和 onunload 事件可用于处理 cookie。
<body onload="checkCookies()">
<script>
function checkCookies(){
alert("Cookies " + (navigator.cookieEnabled ? "可用" : "不可用"));
}
</script>
<p>弹窗-提示浏览器 cookie 是否可用。</p>
</body>
//onchange 事件常结合对输入字段的验证来使用
输入你的名字: <input type="text" id="fname" onchange="myFunction()">
<p>当你离开输入框后,函数将被触发,将小写字母转为大写字母。</p>
<script>
function myFunction(){
var x=document.getElementById("fname");
x.value=x.value.toUpperCase();
}
</script>
//onmouseover 和 onmouseout 事件可用于在用户的鼠标移至 HTML 元素上方或移出元素时
<div onmouseover="mOver(this)" onmouseout="mOut(this)" style="background-color:#D94A38;width:120px;height:20px;padding:40px;">Mouse-Over-Me</div>
<script>
function mOver(obj){
obj.innerHTML="Thank You"
}
function mOut(obj){
obj.innerHTML="Mouse Over Me"
}
</script>
//onmousedown, onmouseup 以及 onclick 构成了鼠标点击事件的所有部分。首先当点击鼠标按钮时,会触发 onmousedown 事件,当释放鼠标按钮时,会触发 onmouseup 事件,最后,当完成鼠标点击时,会触发 onclick 事件
// 增加监听器,或 removeEventListener()
document.getElementById("myBtn").addEventListener("click", displayDate);
function displayDate() {
document.getElementById("demo").innerHTML = Date();
}