JavaScript等同传递性很奇怪

Hri*_*sto 37 javascript transitivity equivalence comparison-operators

我一直在阅读Douglas Crockford的JavaScript:The Good Parts,我遇到了一个对我来说没有意义的奇怪例子:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == undefined  // false
false == null       // false
null == undefined   // true
Run Code Online (Sandbox Code Playgroud)

作者还提到"从不使用==!=.而是始终使用===!==".但是,他没有解释为什么表现出上述行为?所以我的问题是,为什么上面的结果是这样的?JavaScript中不考虑传递性吗?

ale*_*lex 30

'' == '0' // false
Run Code Online (Sandbox Code Playgroud)

左侧是空字符串,右侧是带有一个字符的字符串.它们是错误的,因为它在两个不相同的字符串之间进行比较(感谢Niall).

0 == '' // true
Run Code Online (Sandbox Code Playgroud)

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

0 == '0' // true
Run Code Online (Sandbox Code Playgroud)

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

false == undefined // false
Run Code Online (Sandbox Code Playgroud)

该值undefined在JavaScript中是特殊的,除了以外的任何其他内容都不相同null.但是,这是假的.

false == null // false
Run Code Online (Sandbox Code Playgroud)

再说一次,null很特别.它只等于undefined.这也是假的.

null == undefined // true
Run Code Online (Sandbox Code Playgroud)

null并且undefined是相似的,但不一样.null意味着什么,虽然undefined是未设置或不存在的变量的值.将他们的价值观视为平等是有道理的.

如果你真的很困惑,请检查一下......

'\n\r\t' == 0
Run Code Online (Sandbox Code Playgroud)

仅包含空格的字符串被视为等于0.

道格拉斯·克罗克福德提出了许多建议,但你不必将它们视为福音.:)

TJ Crowder对研究ECMAScript语言规范提出了一个很好的建议,以了解这些相等测试背后的全部故事.

进一步阅读?

规范.

yolpo(关于假值)

  • *"道格拉斯·克罗克福德提出了很多建议,但你不必将它们视为福音."*好吧.克罗克福德是一个聪明的人,他对语言的目的很多,所以非常值得阅读他提出的观点以及他所提出的观点.然后得出你自己的结论. (2认同)

smf*_*ote 8

这个问题的答案与JavaScript如何处理强制有关.在这种情况下==,字符串被强制为数字.因此:

'' == '0'相当于'' === '0'(两者都是字符串,因此不需要强制).

0 == ''相当于0 === 0因为字符串''变为数字0(math.abs('') === 0).

0 == '0'0 === 0因为同样的原因相当于.

false == undefined相当于0 === undefined因为JavaScript在类型不匹配时强制将布尔值作为数字

false == null0 === null因为同样的原因相当于.

null == undefined 这是真的,因为规范是这样说的.

谢谢你提出这个问题.我==对它的理解要好得多.