ECMAScript
中的操作符是独特的,因为他们可用于各种值,包括字符串、数值、布尔值,甚至还有对象。
指数操作符
ECMAScript 2017
新增,使用两个**
表示,相当于使用Math.pow()
加性操作符
即加法和减法操作符
加法操作符
- 如果有任一操作数是
NaN
,则返回NaN
; - 如果是
Infinity
加Infinity
,则返回Infinity
; - 如果是
-Infinity
加-Infinity
,则返回-Infinity
; - 如果是
Infinity
加-Infinity
,则返回NaN
; - 如果是
+0
加+0
,则返回+0
; - 如果是
-0
加+0
,则返回+0
; - 如果是
-0
加-0
,则返回-0
。
不过,如果有一个操作数是字符串,则要应用如下规则: - 如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面;
- 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。
如果有任一操作数是对象、数值或布尔值,则调用它们的toString()
方法以获取字符串,然后再
应用前面的关于字符串的规则。对于undefined
和null
,则调用String()
函数,分别获取"undefined"
和"null"
console.log(12 + 12) //24
console.log(12 + '12') //'1212' 有一个是字符串会变成字符串加
console.log(12 + true) //13 并没有应用前面的规则
console.log(12 + {}) //'12[object Object]' 应用了规则
console.log(12 + '') //'12' 将数值转换成字符串
减法操作符
- 如果两个操作数都是数值,则执行数学减法运算并返回结果。
- 如果有任一操作数是
NaN
,则返回NaN
。 - 如果是
Infinity
减Infinity
,则返回NaN
。 - 如果是-Infinity 减-Infinity,则返回 NaN。
- 如果是 Infinity 减-Infinity,则返回 Infinity。
- 如果是-Infinity 减 Infinity,则返回-Infinity。
- 如果是+0 减+0,则返回+0。
- 如果是+0 减-0,则返回-0。
- 如果是-0 减-0,则返回+0。
- 如果有任一操作数是字符串、布尔值、null 或 undefined,则先在后台使用 Number()将其转 换为数值,然后再根据前面的规则执行数学运算。如果转换结果是 NaN,则减法计算的结果是
NaN。 - 如果有任一操作数是对象,则调用其 valueOf()方法取得表示它的数值。如果该值是 NaN,则减法计算的结果是 NaN。如果对象没有 valueOf()方法,则调用其 toString()方法,然后再将得到的字符串转换为数值。
console.log(5 - '2') //3 减法会将字符串数值转换为数值再执行减操作
let result1 = 5 - true; // true被转换为1,所以结果是4
let result2 = NaN - 1; // NaN
let result3 = 5-3; //2
let result4 = 5 - ""; // ""被转换为0,所以结果是5
let result6 = 5 - null;// null被转换为0,所以结果是5
关系操作符
关系操作符执行比较两个值得操作,包括小于(<)
、大于(>)
、小于等于(<=)
和大于等于(>=)
在将他们应用到不同数据类型是也会发生类型转换和其他行为:
- 如果操作数有一个是数值或布尔值,则比较时会转换为数值
- 如果操作数都是字符串,则比较对应字符的编码
- 如果有任一操作数是对象,则调用
valueOf()
方法,再执行前面的规则。如果没有valueOf()
方法,则调用toString()
方法,再执行前面的规则任何关系操作符在设计比较
NaN
时都返回false
相等操作符
包括相等,不相等,全等和不全等。相等用==
,不相等用!=
,全等用===
,不全等用!==
相等和不相等会先进行类型转换再确定操作符是否相等
null
和undefined
相等,并且他们不能转换为其他类型的值再比较
NaN
是不等于NaN
的
两个对象如果要相等,需要引用相等,即指向同一个对象
console.log(NaN == NaN) //false
console.log((null == undefined) //true
console.log(null === undefined) //false 类型不同
let obj = {}
let another = obj
console.log(obj == another) //true
console.log({} == {}) //false 引用不同