4

据我所知,(x == false)应该做与 相同的事情!x,因为他们都试图解释x为布尔值,然后否定它。

但是,当我尝试对此进行测试时,我开始出现一些非常奇怪的行为。

例如:

false == []并且false == ![]都返回true。

此外

false == undefined并且true == undefined两者都返回false,就像

false == Infinity并且true == Infinity

false == NaNtrue == NaN

这里到底发生了什么?

http://jsfiddle.net/AA6np/1/

4

3 回答 3

6

都在这里:http ://es5.github.com/#x11.9.3

对于以下情况false == []

  • false被转换为数字 (0),因为这总是用布尔值完成的。
  • [] 通过调用 转换为原语[].valueOf().toString(),即为空字符串。
  • 0 == ""然后通过将空字符串转换为数字来评估,因为结果也是 0,false == []所以为真。

对于以下情况false == ![]

  • 逻辑非运算符!是通过返回相反的ToBoolean(GetValue(expr))
  • ToBoolean()对任何对象始终为真,因此![]计算结果为false(because !true = false),因此false == ![]也为真。

(false == undefined) === false甚至(true == undefined) === false更简单:

  • falsetrue再次转换为数字(分别为 0 和 1)。
  • 因为 undefined 不能与数字进行比较,所以链会冒泡到默认结果,即false.

其他两种情况的评估方式相同:首先将布尔值与数字进行比较,然后将其与另一个数字进行比较。由于 0 和 1 都不等于 Infinity 或不是数字,因此这些表达式的计算结果也为false

于 2012-06-29T16:05:55.673 回答
1

规范的第 9.3 节描述了抽象相等算法。

对于x == y其中 x =false和 y = []

  1. 没有。类型不相等。
  2. 不,x 不为空。
  3. 没有。x 不是未定义的。
  4. 不,x 不是数字
  5. 不,x 不是字符串。
  6. 是的,x 是一个布尔值,所以我们比较 ToNumber(x) 和 y。

重复算法, x=0和 y= []
我们在第 8 步结束:Type(x) == number。和类型(y)==对象。
因此,让结果为 x == ToPrimitive (y)。
ToPrimitive([]) == ""

0现在,使用 x=和 y=再次重复该算法""。我们在 4 结束:“返回比较结果 x == ToNumber(y)。”
ToNumber("") == 0

算法的最后一次重复在步骤 1 结束(类型相等)。通过 1.c.iii,0 == 0,返回 true。

通过使用该算法,可以以类似的方式获得其他结果。

于 2012-06-29T16:10:52.650 回答
0
false == []

==允许使用Javascript 应用转换。该对象将转换为原始类型以与布尔值匹配,留下一个空字符串。false 将转换为数字 0。将空字符串与数字 0 进行比较。字符串转换为数字 0,因此表达式为“true”

![]

Javascript 将对象转换为布尔值 true,因此否认 true 结束为 false。

false == undefined true == undefined
false == Infinity and true == Infinity
false == NaN and true == NaN

又有点像!false 转换为 0,true 转换为 1。然后, undefined 转换为一个数字,即...... NaN!无论如何都是假的

我建议=== !==尽可能多地使用以获得“预期”的结果,除非您非常清楚自己在做什么。使用类似Boolean(undefined) == false 的东西也会很好。

转换内容时检查 ECMAScript 规范以获取所有详细信息。

于 2012-06-29T16:22:08.233 回答