有趣的数组与null元素JavaScript行为

时间:2015-08-28 15:49:25

标签: javascript

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

==用于比较不同类型的内容时,例如数组([null])和false,它会执行特定的步骤,称为Abstract Equality Algorithm (引用如下)试图强迫他们做可以比较的事情。 (因为==是“松散”的等式运算符。)

首先它会看到操作数是null还是undefined,但在这种情况下都不是。

然后它会看到它是在比较一个数字还是一个字符串,但在这种情况下也不是这样。

然后似乎任何一个操作数都是布尔值,当然这是一个布尔值。由于其中一个是布尔值,因此它在规范中执行一个名为ToNumber的抽象操作,将另一个转换为数字并执行另一个==。 (Number函数用作函数而不是构造函数时,基本上是抽象ToNumber操作的包装器。)

所以

[null] == false

变为

0 == false

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

所以现在==的某个操作数是一个数字。因此它将其他转换为数字。 Number(false)0

因此,[null] == false是真的。

那么[null, null] == false呢?将[null, null]转换为字符串时,我们会","ToNumber无法转换为有效数字。因此它将其转换为NaN。关于NaN的一个有趣的事情是,它是一个数字,但它永远不会与其他任何东西相等。所以:

[null, null] == false 

变为

NaN == false

变为

NaN == 0

...这是false,因为(再次)NaN永远不会等同于任何事情。

这是抽象平等算法:

  1. ReturnIfAbruptx)。
  2. ReturnIfAbrupty)。
  3. 如果Typex)与Type(y)相同,那么

    a)返回执行Strict Equality Comparison x === y的结果。

  4. 如果xnullyundefined,请返回true

  5. 如果xundefinedynull,请返回true
  6. 如果Typex)为数字且类型(y)为字符串,则返回比较结果 x == ToNumbery)。
  7. 如果Typex)为字符串且类型(y)为数字,则返回比较结果ToNumber(x)== y
  8. 如果Typex)为布尔值,则返回比较结果 ToNumberx)== y
  9. 如果Typey)为布尔值,则返回比较结果 x == ToNumbery)。
  10. 如果Typex)是String,Number或Symbol而Type(y)是Object,则返回比较结果 x == ToPrimitivey)。
  11. 如果Typex)是对象,而类型(y)是字符串,数字或符号,则返回 比较结果ToPrimitivex)== y
  12. 返回false