‘==’ 又是一个JavaScript 中一个著名的失误,许多的编程规范甚至要求完全避免用 == 运算,使用 ‘=== 来替代 ‘==‘。
对于 ‘==’, 它在ECMA262 中写的非常的复杂,但是归根结底,类型不通的变量比较的时候也只有三条规则:
- undefined 与 null 相等
- 字符串和 bool都转换为数字再比较
- 对象转换为 primitive类型再比较
这样我们就可以理解:
- flase == ‘0’ (true)
- true == ‘true’ (true)
- [] == 0 (true)
- [] == false (true)
- new Boolean(‘false’) == false (false)
这里不太符合直觉的有两点:
-
一个是即使字符串与 boolean 比较,也都要转换成数字;
-
另一个是对象如果转换成了 primitive 类型跟等号另一边类型恰好相同,则不需要转换成数字。
此外,== 的行为也经常跟 if 的行为(转换为 boolean)混淆。总之,我建议,仅在确认 == 发生在 Number 和 String 类型之间时使用,比如:
document.getElementsByTagName('input')[0].value == 100
总而言之,尽量使用 ===