我一直在阅读 Douglas Crockford's JavaScript: The Good Parts ,我遇到了这个对我来说没有意义的奇怪例子:
'' == '0' // false
0 == '' // true
0 == '0' // true
false == undefined // false
false == null // false
null == undefined // true
作者还继续提到“永远不要使用 ==
和 !=
。相反,请始终使用 ===
和 !==
”。但是,他没有解释为什么会出现上述行为?所以我的问题是,为什么上面的结果是这样的? JavaScript 不考虑传递性吗?
最佳答案
'' == '0' // false
左边是一个空字符串,右边是一个有一个字符的字符串。它们是错误的,因为它在两个不相同的字符串之间进行比较(感谢 Niall )。
0 == '' // true
因此,为什么这个是真的,因为 0
是 falsy 而空字符串是 falsy。
0 == '0' // true
这个有点棘手。规范指出,如果操作数是字符串和数字,则将字符串强制转换为数字。 '0'
变为 0
。谢谢smfoote .
false == undefined // false
值 undefined
在 JavaScript 中是特殊的,不等于除 null
之外的任何其他值。然而,它是虚假的。
false == null // false
同样,null
是特殊的。它只等于 undefined
。它也是虚假的。
null == undefined // true
null
和 undefined
相似,但不相同。 null
表示无,而undefined
是未设置或不存在的变量的值。将它们的值视为相等是有道理的。
如果你想真正感到困惑,请检查这个...
'\n\r\t' == 0
仅由空格组成的字符串被认为等于 0。
Douglas Crockford 提出了很多建议,但您不必将它们当作福音。 :)
T.J. Crowder提出了研究 ECMAScript Language Specification 的极好建议了解这些相等性测试背后的全部故事。
进一步阅读?
The spec .
关于JavaScript 相等传递性很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447153/