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语言规范提出了一个很好的建议,以了解这些相等测试背后的全部故事.
进一步阅读?
规范.
这个问题的答案与JavaScript如何处理强制有关.在这种情况下==
,字符串被强制为数字.因此:
'' == '0'
相当于'' === '0'
(两者都是字符串,因此不需要强制).
0 == ''
相当于0 === 0
因为字符串''
变为数字0
(math.abs('') === 0
).
0 == '0'
0 === 0
因为同样的原因相当于.
false == undefined
相当于0 === undefined
因为JavaScript在类型不匹配时强制将布尔值作为数字
false == null
0 === null
因为同样的原因相当于.
null == undefined
这是真的,因为规范是这样说的.
谢谢你提出这个问题.我==
对它的理解要好得多.