据我所知,(x == false)
应该与!x
做同样的事情,因为他们都试图将x
解释为布尔值,然后否定它。
然而,当我试图测试时,我开始得到一些非常奇怪的行为。
例如:
false == []
和false == ![]
都返回true。
此外
false == undefined
和true == undefined
都返回false,
false == Infinity
和true == Infinity
以及
false == NaN
和true == NaN
。
这到底发生了什么?
答案 0 :(得分:6)
一切都在这里:http://es5.github.com/#x11.9.3
对于false == []
:
false
被转换为数字(0),因为这总是用布尔值来完成。[].valueOf().toString()
转换为基元,这是一个空字符串。0 == ""
,并且因为结果也为0,false == []
为真。对于false == ![]
:
!
是通过返回ToBoolean(GetValue(expr))
ToBoolean()
始终为true,因此![]
评估为false
(因为!true = false
),因此false == ![]
也为真。 (false == undefined) === false
和(true == undefined) === false
甚至更简单:
false
和true
再次转换为数字(分别为0和1)。false
。另外两种情况的评估方式相同:第一个布尔值为Number,然后将其与另一个数字进行比较。由于0和1都不等于无穷大或不是数字,因此这些表达式也会计算为false
。
答案 1 :(得分:1)
摘要相等算法在section 9.3 of the specification中描述。
对于x == y
,其中x = false
且y = []
:
重复算法,x = 0
和y = []
我们在步骤8结束:Type(x)== number。和类型(y)==对象。
所以,让结果为x == ToPrimitive(y)
ToPrimitive([])==“”
现在,再次使用x = 0
和y = ""
重复该算法。我们在4结束:“返回比较结果x == ToNumber(y)。”
ToNumber(“”)== 0
算法的最后一次重复在步骤1结束(类型相等)。通过1.c.iii,0 == 0,返回true。
通过使用算法,可以以类似的方式获得其他结果。
答案 2 :(得分:0)
false == []
使用==
允许Javascript应用转化。该对象将转换为与布尔匹配类型的基元,留下空字符串。 false将转换为数字0.比较空字符串和数字0.字符串将转换为0的数字,因此表达式为“true”
![]
Javascript将对象转换为布尔值true,因此拒绝true结尾为假。
false == undefined true == undefined
false == Infinity and true == Infinity
false == NaN and true == NaN
再次有点相同! false被转换为0,true为1.然后,undefined被转换为一个数字...... NaN!在任何情况下都是假的
除非您非常了解自己在做什么,否则我建议您尽可能多地使用=== !==
来获得“预期”结果。使用像Boolean(undefined) == fals
e这样的东西也会很好。
检查ECMAScript规范,了解转换内容时的所有细节。