JavaScript 相等传递性很奇怪

标签 javascript comparison-operators equivalence transitivity

我一直在阅读 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

因此,为什么这个是真的,因为 0falsy 而空字符串是 falsy

0 == '0' // true

这个有点棘手。规范指出,如果操作数是字符串和数字,则将字符串强制转换为数字。 '0' 变为 0。谢谢smfoote .

false == undefined // false

undefined 在 JavaScript 中是特殊的,不等于除 null 之外的任何其他值。然而,它是虚假的

false == null // false

同样,null 是特殊的。它只等于 undefined。它也是虚假的

null == undefined // true

nullundefined 相似,但不相同。 null 表示,而undefined 是未设置或不存在的变量的值。将它们的值视为相等是有道理的。

如果你想真正感到困惑,请检查这个...

'\n\r\t' == 0

仅由空格组成的字符串被认为等于 0。

Douglas Crockford 提出了很多建议,但您不必将它们当作福音。 :)

T.J. Crowder提出了研究 ECMAScript Language Specification 的极好建议了解这些相等性测试背后的全部故事。

进一步阅读?

The spec .

yolpo (on falsy values)

关于JavaScript 相等传递性很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447153/

相关文章:

javascript - 用于匹配某些 url 的正则表达式

javascript - 在 JS 中手动输入 VS 设置值

javascript - 大尺寸图像在 jcrop 中无法正确裁剪

javascript - 连续使用四次等于比较运算符给出错误结果

python - 为什么我无法检查 Python 中 Popen() 的 stderr 的字符串等效性?

javascript - chrome扩展后台页面错误: "Uncaught SyntaxError: Unexpected token <"

java - Java Method 对象是否可以通过标识(即 ==)进行比较,还是必须使用 equals()?

php - 在 PHP 中用 == 比较不同的字符串返回 true

python - 在 Python 类中支持等价的优雅方法 ("equality")

javascript - 相当于 PHP 中的 javascript 代码