相等操作符回顾

最早的ECMAscript中的相等和不相等操作符会在执行比较之前,先将对象转换成相似的类型(即,强制转型)。

后来有人对这种转换的合理性提出质疑。

最后,ECMAcript的解决方案是提供两组操作符:

  • 相等和不相等——先转换再比较
  • 全等和不全等——仅比较而不转换

相等(==)和不相等(!=)

"==“和”!=“是互补对立的:如果两个操作数用”==“比较时返回 true,则这两个操作数用”!=“比较时就会返回 false ; 另外,用”==“返回 false 时,用”!="则返回true,这点很容易理解。

这两个操作符都会强制转型,在比较相等性之前会作以下工作:

  • 布尔值转换为数值,详见后面的补充。
  • 字符串和数值比较时,将字符串转换成数值
  • 对象和不是对象的操作数比较时,调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较。

==和!=在进行比较之时遵循以下规则:

  • null 和 undefined 是相等的。null == undefined
    • 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
  • NaN和任何操作数不等,NaN 不等于NaN。
    • 如果有一个操作数是 NaN,则"==“返回 false ,而”!="返回 true 。
    • 重要提示:即便两个操作数都是NaN,"=="也返回false,因为按照规则,NaN 不等于NaN。
  • 如果两个操作数都是对象,则比较它们是不是指向同一个对象。

补充:

1. 相等运算符隐藏的强制转型,会带来一些违反直觉的结果:

 '' == 0            // true
' \t\r\n ' == 0     // true

false == 'false'    // false,这个超坑爹
false == '0'        // true

2.

true == 1 返回true
false == 0 返回true
true == 2 返回true

还有另外一个概念叫Boolean 表达式,容易和以上概念混淆。在需要用到 Boolean 表达式的情景(比如if等语句中的条件判断),非 Boolean 表达式也可以被转换为 Boolean 值,但是要遵循下列规则:

  • 所有的对象都被当作 true。
  • 当且仅当字符串为空时,该字符串被当作 false。
  • null 和 undefined 被当作 false。
  • 当且仅当数字为零时,该数字被当作 false。

全等(===)和不全等(!==)

和**相等(==)和不相等(!=)**类似,只不过在比较之前没有强制转型的过程,两个操作数直接比较。

尽量使用全等和不全等

举个简单的例子,团队协作中你肯定需要读别人的代码。而当你看到“==”时,要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,还是不应该转型但是写错了……所花费的脑力和时间比明确的“===”(加上可能需要的明确转型)要多得多。要记得团队中的每个人(包括原作者自己)都需要付出这理解和维护成本。

文章目录
  1. 相等(==)和不相等(!=)
  2. 全等(===)和不全等(!==)
  3. 尽量使用全等和不全等