2015-08-28 50 views
-3

任何想法为什么它的行为如此?具有空元素的有趣数组JavaScript行为

+0

'!!测试' – tymeJV

+1

用'=='比较数组与非数组几乎没有实际用途,除非您认为这种娱乐或您喜欢在ECMAScript规范中研究类型转换规则的复杂性。这是什么意思? – jfriend00

+0

这已被问了几次。寻找真相和虚假。 'if(非null,空字符串,0)'总是返回true。至于其他,看看test.toString()返回什么,你会看到为什么[null] == false是true,[null,null] == false是false – mplungjan

回答

2

==用来比较不同类型的东西,像一个数组([null])和false,它有它通过具体步骤,称为Abstract Equality Algorithm(以下引用),试图强迫他们的东西,它可以比较。 (因为==是“松散的”相等操作。)

首先它看到如果操作数是nullundefined,但在这种情况下也不是。

然后看看它是否比较数字和字符串,但在这种情况下也不是这样。

然后,看起来如果两个操作数是布尔值,当然这些是。由于其中一个是布尔型的,因此它在规范中执行一个名为ToNumber的抽象操作,将另一个转换为数字并执行另一个操作==。 (该Number功能,作为一个功能,而不是一个构造函数中使用时,基本上是抽象ToNumber操作的包装。)

所以

[null] == false 

成为

0 == false 

...因为ToNumber([null])将其参数强制转换为字符串(通过ToPrimitive),得到"",然后将其转换为0

所以现在==有一些操作数是一个数字。所以它将其他也转换为数字。 Number(false)0。因此,[null] == false是正确的。


那么[null, null] == false呢?当将[null, null]转换为字符串时,我们得到",",其中ToNumber无法变成有效数字。所以它将它转换为NaNNaN有趣的事情之一是它是一个数字,但它永远不会等于其他任何东西。所以:

[null, null] == false 

成为

NaN == false 

成为

NaN == 0 

...这是false,因为(再次)NaN永远无所不能。


以下是摘要平等算法:

  1. ReturnIfAbruptx)。
  2. ReturnIfAbrupty)。
  3. 如果Typex)是相同的类型(y),然后

    一个)返回执行严格相等比较x === y的结果。

  4. 如果xnullyundefined,返回true

  5. 如果xundefinedynull,返回true
  6. 如果Typex)是数目和类型(y)是字符串,返回
    比较 x == ToNumbery)的结果。
  7. 如果Typex)是字符串和类型(y)是Number,
    回到比较ToNumber(x)== y的结果。
  8. 如果Typex)是布尔值,返回的比较 ToNumberx)== y的结果。
  9. 如果Typey)是布尔值,返回的比较 x == ToNumbery)的结果。
  10. 如果Typex)或者是字符串,数字,或符号和类型(y)是Object,然后返回
    比较 x == ToPrimitivey)的结果。
  11. 如果Typex)是Object和类型(y)或者是字符串,数字,或符号,然后返回
    比较ToPrimitivex)== y的结果。
  12. 返回false
+0

https:// stackoverflow。com/questions/5491605/empty-arrays-seem-to-the-same-true-and-false-at-the-the-time- 这是JS ==比较的一个很好的参考,特别是与数组 – Matt