尽我所知,(x == false)
应该做同样的事情!x
,因为他们都试图解释x
作为布尔值,然后对其求反。
然而,当我尝试对此进行测试时,我开始出现一些极其奇怪的行为。
例如:
false == []
and false == ![]
两者都返回 true。
此外
false == undefined
and true == undefined
两者都返回 false,就像
false == Infinity
and true == Infinity
and
false == NaN
and true == NaN
.
这里究竟发生了什么?
http://jsfiddle.net/AA6np/1/ http://jsfiddle.net/AA6np/1/
一切都在这里:http://es5.github.com/#x11.9.3 http://es5.github.com/#x11.9.3
对于以下情况false == []
:
-
false
转换为数字 (0),因为这始终是通过布尔值完成的。
- [] 通过调用转换为原语
[].valueOf().toString()
,这是一个空字符串。
-
0 == ""
然后通过将空字符串转换为数字来求值,因为结果也是 0,false == []
是真的。
对于以下情况false == ![]
:
- The 逻辑非运算符! http://es5.github.com/#x11.4.9通过返回相反的值来执行
ToBoolean(GetValue(expr))
-
ToBoolean() http://es5.github.com/#x9.2对于任何对象总是正确的,所以
![]
评估为false
(因为!true = false
),因此是false == ![]
也是如此。
(false == undefined) === false
and (true == undefined) === false
甚至更简单:
-
false
and true
再次转换为数字(分别为 0 和 1)。
- 因为未定义不能与数字进行比较,所以链会冒泡到默认结果,即
false
.
其他两种情况的评估方式相同:首先将布尔值转换为数字,然后将其与其他数字进行比较。由于 0 和 1 都不等于无穷大或不是数字,因此这些表达式的计算结果也为false
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)