引子
本文讲述为 ECMA-262 中描述可用于操作数据值的操作符中的 相等操作符;
相等操作符
判断两个变量是否相等是编程中最重要的操作之一,ECMAScript 中的相等和不相等操作符,原本在比较之前会执行类型转换,但很快就有人质疑这种转换是否应该发生;
最终,ECMAScrip提供了两组操作符:
第一组是 等于(==) 和 不等于(!=) ,它们在比较之前执行转换;
第二组是 全等(===) 和 不全等(!==) ,它们在比较之前不执行转换;
等于与不等于
ECMAScript 中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回 true;不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回 true;这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等
转换比较规则
在转换操作数的类型时,相等和不相等操作符遵循如下规则:
- 如果任一操作数是布尔值,则将其转换为数值再比较是否相等;false转换为 0,true 转换为 1;
- 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等;
- 如果一个操作数是对象,另一个操作数不是,则调用对象的
valueOf()方法获得其原始值,再根据上述进行比较
在进行比较时,相等和不相等操作符遵循如下规则:
-
null和undefined相等,并且这两个类型不能转换为其他类型的值再进行比较; -
如果两个操作数都是对象,则比较它们是不是同一个对象;如果两个操作数都指向同一个对象,
则相等操作符则返回
true,否则,两者不相等; -
如果有任一操作数是
NaN,则相等操作符返回false,不相等操作符返回true;
注意: 即使两个操作数都是
NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN
特殊转换表
下面列举了一些特殊情况及比较的结果,有助于理解:
| 表达式 | 结果 | 表达式 | 结果 |
|---|---|---|---|
| null == undefined | true | "5" == 5 | true |
| "NaN" == NaN | false | false == 0 | true |
| NaN != NaN | false | true == 1 | true |
| NaN == NaN | false | undefined == 0 | false |
| 5 == NaN | false | null == 0 | false |
全等与不全等
全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。
全等操作符由 3 个等于号(===)表示,只有两个操作数在不转换的前提下相等才返回 true; 如下:
let result1 = ("55" == 55); // true,转换后相等
let result2 = ("55" === 55); // false,不相等,因为数据类型不同
第一个比较使用相等操作符,它会把字符串"55"转换为数值 55 结果相等,所以返回 true;
第二个比较使用全等操作符,因为没有转换,字符串和数值当然不能相等,所以返回 false。
不全等操作符用一个叹号和两个等于号( !== )表示,只有两个操作数在不转换的前提下不相等才返回 true; 如下:
let result1 = ("55" != 55); // false,转换后相等
let result2 = ("55" !== 55); // true,不相等,因为数据类型不同
第一个比较使用不相等操作符,它会把字符串 "55" 转换为数值 55 结果相等,所以返回 false
第二个比较使用不全等操作符,不会转换,直接比较结果不相等,所以返回 true
虽然 null == undefined 是 true(因为这两个值类似),但 null === undefined 是 false,因为它们数据类型不同
总结
相等( == )不相等( != ) ,全等 ( === ) 不全等( !==) 这几个都是相当常用的操作符
- 相等不相等比较执行前转换,全等不全等不会执行转换
NaN与任何数据类型对比都为false,对自己也这么狠- 由于相等和不相等操作符存在类型转换问题,因此推荐使用全等和不全等操作符;这样有助于在代码中保持数据类型的完整性