【JS红宝书¹⁶】相等操作符

193 阅读4分钟

引子

本文讲述为 ECMA-262 中描述可用于操作数据值的操作符中的 相等操作符

相等操作符

判断两个变量是否相等是编程中最重要的操作之一,ECMAScript 中的相等和不相等操作符,原本在比较之前会执行类型转换,但很快就有人质疑这种转换是否应该发生;

最终,ECMAScrip提供了两组操作符:

第一组是 等于(==)不等于(!=) ,它们在比较之前执行转换;

第二组是 全等(===)不全等(!==) ,它们在比较之前不执行转换;

等于与不等于

ECMAScript 中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回 true;不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回 true;这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等

转换比较规则

在转换操作数的类型时,相等和不相等操作符遵循如下规则:

  • 如果任一操作数是布尔值,则将其转换为数值再比较是否相等;false转换为 0,true 转换为 1;
  • 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等;
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法获得其原始值,再根据上述进行比较

在进行比较时,相等和不相等操作符遵循如下规则:

  • nullundefined 相等,并且这两个类型不能转换为其他类型的值再进行比较;

  • 如果两个操作数都是对象,则比较它们是不是同一个对象;如果两个操作数都指向同一个对象,

    则相等操作符则返回 true,否则,两者不相等;

  • 如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true

注意: 即使两个操作数都是 NaN,相等操作符也返回 false,因为按照规则,NaN 不等于 NaN

特殊转换表

下面列举了一些特殊情况及比较的结果,有助于理解:

表达式结果表达式结果
null == undefinedtrue"5" == 5true
"NaN" == NaNfalsefalse == 0true
NaN != NaNfalsetrue == 1true
NaN == NaNfalseundefined == 0false
5 == NaNfalsenull == 0false

全等与不全等

全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。

全等操作符由 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 == undefinedtrue(因为这两个值类似),但 null === undefinedfalse,因为它们数据类型不同

总结

相等( == )不相等( != ) ,全等 ( === ) 不全等( !==) 这几个都是相当常用的操作符

  • 相等不相等比较执行前转换,全等不全等不会执行转换
  • NaN 与任何数据类型对比都为 false,对自己也这么狠
  • 由于相等和不相等操作符存在类型转换问题,因此推荐使用全等和不全等操作符;这样有助于在代码中保持数据类型的完整性