一、一元操作符
1. 前置递增(++age;)和前置递减(--age;)操作符
前置递增和前置递减操作符会让变量的值在语句被求值之前改变(即先改变后求值)
let age = 20;
let anotherAge = --age + 2;
console.log(age); // 19
console.log(anotherAge); // 21
2. 后置递增(age++;)和后置递减(age--;)操作符
后置递增和后置递减操作符在语句被求值之后才会改变变量的值(即先求值后改变)
let age = 20;
let anotherAge = age++ + 2;
console.log(age); // 21
console.log(anotherAge); // 22
二、布尔操作符
1. 逻辑非(!)
- 如果操作数是对象,则返回false;
- 如果操作数是非空字符串,则返回false;
- 如果操作数是空字符串,则返回true;
- 如果操作数是数值0,则返回true;
- 如果操作数是非0数值(包括Infinity),则返回false;
- 如果操作数是null,则返回true;
- 如果操作数是undefined,则返回true;
- 如果操作数是NaN,则返回true;
1. 逻辑与(&&)
逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个操作数进行求值。即如果第一个操作数是false,无论第二个操作数是什么,都不会对第二个操作数进行求值,直接返回false。特点是不一定返回布尔值,遵循以下规则:
- 如果第一个操作数是对象,则返回第二个操作数
- 如果第二个操作数是对象,只有第一个操作数值为true时才会返回该对象
- 如果有一个操作数是null,则返回null
- 如果有一个操作数是undefined,则返回undefined
- 如果有一个操作数是NaN,则返回NaN
- 0 && (任何值),都会返回0
1. 逻辑或(||)
与逻辑与操作符类似,也具有短路的特性。对逻辑或而言,第一个操作数求值为true,那么第二个操作数就不会被求值。返回值遵循以下规则:
- 如果第一个操作数是对象,则返回第一个操作数
- 如果第一个操作数求值为false,则返回第二个操作数
console.log(false || 0) // 0
console.log(false || null) // null
console.log(false || NaN) // NaN
console.log(false || undefined) // undefined
- 如果两个操作数都是对象,则返回第一个操作数
- 如果两个操作数都是NaN,则返回NaN
- 如果两个操作数都是null,则返回null
- 如果两个操作数都是undefined,则返回undefined
三、指数操作符(**)
ES7新增的指数操作符,在ES7之前实现指数操作需要以下操作:
console.log(Math.pow(3,2)) // 9
console.log(Math.pow(16,0.5)) // 4
使用ES7新增的指数操作符进行指数赋值(**=):
let a = 2;
a **=2;
console.log(a); // a = 4
四、关系操作符
关系操作符执行比较两个值的操作,包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=),这几个操作符都返回布尔值。规则如下:
- 如果操作数都是数值,则执行数值比较
- 如果操作数都是字符串,则逐个比较字符串中对应的字符编码
- 如果有任一操作数是数值,则将另外一个操作数转为数值进行比较(如果不能转换成数值,即为'NaN',任何关系在比较NaN时都会返回false)
- 如果有任一操作数是对象,则调用valueOf()方法,取得结果后根据前面的规则进行比较。如果没有valueOf()操作符,则调用toString()方法,取得结果后根据前面的规则进行比较。
- 如果有任一操作符是布尔值,则转换为数值后进行比较
五、相等操作符
- null == undefined ,null和undefined相等,但不全等
- null 和 undefined 不能转换为其他类型的值进行比较
- 如果有任一操作数是NaN,则相等操作符返回false,即使两个操作数都是NaN,也会返回false。
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则返回true