运算符
- 算术,赋值等运算符
-
”=“ 赋值
-
”===“ 严格全等,==只有值等
-
”!==“ 不相等
-
** 幂,如3** 2,3的2次方
-
+=类相同
-
=
-
三元运算符
condition ? 运行这段代码 : 否则,运行这段代码
-
x>>>y,无符号右移
-
~ 按位非,反转被操作的位,001反转后110
- 解构
var foo = ["one", "two", "three"];
// 不使用解构
var one = foo[0];
var two = foo[1];
var three = foo[2];
// 使用解构
var [one, two, three] = foo;
- 其他.
-
delete操作符删除一个对象的属性或者一个数组中某一个键值,操作成功,仍旧存在但值变为undefined
-
void 运算符:表示运算没有返回值
-
in操作符:
指定的属性确实存在于所指定的对象中,返回true。如果是数组,则不能用值来判断是否in
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees; // returns true
"bay" in trees; // returns false
"length" in trees; //returns true
也就是说,只能用属性而不能用值in
- instance of:
确认一个对象在运行时的类型
var theDay = new Date(1995, 12, 17);
if (theDay instanceof Date) {
// statements to execute
}
- typeof X ,return X的类型
typeof true; // returns "boolean"
函数与表达式
- 函数本身就是对象。方法是,一个函数是一个对象的属性时。
函数括号:函数调用运算符,想直接调用函数的地方才这么写
function 名字(){}
-
内置浏览器函数:大多数并非js编写,并不是函数,是方法。
-
函数传参如果是对象,函数改变了这个对象的属性,这样的改变结果包括函数外部
-
匿名函数也称为函数表达式
匿名函数里的代码并不会直接运行,相当于调用函数时,函数不加括号
运行负载的代码以响应事件触发。函数表达式与函数声明有一些区别。函数声明会进行声明提升,而函数表达式不会。
myButton.onclick = function() {
alert('hello');
}
函数表达式也可以提供函数名,并且可以用于在函数内部代指其本身,或者在调试器堆栈跟踪中识别该函数
const factorial = function fac(n) {
return n<2 ? 1 : n*fac(n-1)};
console.log(factorial(3)); //6
- 函数作用域:scope
函数内定义的变量和其他东西都在它们自己的单独的范围内。所有函数的最外层被称为全局作用域
- 闭包
function outside(x) {
function inside(y) {
return x + y;
}
return inside;
}
fn_inside = outside(3);
result = fn_inside(5); // returns 8
result1 = outside(3)(5); // returns 8
一个闭包必须保存它可见作用域中所有参数和变量。因为每一次调用传入的参数都可能不同,每一次对外部函数的调用实际上重新创建了一遍这个闭包。只有当返回的 inside 没有再被引用时,内存才会被释放。
命名冲突:
作用域链中的第一个元素就是最里面的作用域,最后一个元素便是最外层的作用域
最里面的作用域有更高的优先权
- arguments对象:
里面存储了传递过来的所有实参
在你事先不知道会需要将多少参数传递给函数时十分有用。
argument是类数组对象,并不是一个数组。称其为类数组对象是说它有一个索引编号和length属性,并不具有pop等函数
function myConcat(separator) {
var result = ' ';
for (var i = 1; i < arguments.length; i++)
{
result += arguments[i] + separator;
}
return result;
}
// returns red, orange, blue, myConcat(", " , "red", "orange", "blue");
- 参数:
- 默认参数:在参数中直接设默认值
function multiply(a, b = 1) {
return a*b;
}
multiply(5); // 5
- 剩余参数:允许将不确定数量的参数表示为数组
function multiply(multiplier, ...theArgs) {
return theArgs.map(x => multiplier * x);
}
var arr = multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]
- 特殊函数
- 箭头函数
更简洁的表达方式,
() => x 比 () => { return x; } 更简洁一些,但后一种保留 return 的写法才支持使用多个语句
//无参
var fn1 = () => {}
// 单个参数
var fn2 = a => {}
// 多个参数
var fn3 = (a, b) => {}
// 可变参数
var fn4 = (a, b, ...args) => {} //箭头函数不能使用arguments
解决严格模式下的this
function Person(){
this.age = 0;
setInterval(() => {
this.age++; // 这里的`this`正确地指向 person 对象,如果采用普通函数,即闭包那么非严格模式下this将被定义为全局对象,无法起作用
}, 1000);}
var p = new Person();
//或者
用var selt=this,使得this.age变为self.age
- 预定义函数:
eval() 方法会对一串字符串形式的 JavaScript 代码字符求值
isFinite() 函数判断传入的值是否是有限的数值
isNaN() 函数判断一个值是否是 NaN
- 表达式:
- this:正在调用的对象;也可以指代当前的表单元素
<input type="text" name="age" size=3 onChange="validate(this, 18, 99);">
onchange事件处理中调用validat函数,用this来指代当前的表单元素
- new:
创建一个自定义类型或者是预置类型的对象实例
- super:
来调用一个对象父类的函数(尤其是构造函数)
super([arguments]); // calls the parent constructor. super.functionOnParent([arguments]);