8

在 JavaScript 中,我注意到[]==![]结果是true. 演示

我不明白这个结果。你能解释一下为什么吗?

4

1 回答 1

10

[]是一个数组,但是![]是一个布尔值。每当您尝试比较具有不同类型的==两个对象时,都应将两个对象转换为可比较的对象(使用ToNumber,请参见 11.9.3 中的步骤 7.)。这就是为什么[] == ![]产量为真,第一个空数组被评估为false.

11.9.3 抽象等式比较算法

比较 x == y,其中 x 和 y 是值,产生真或假。如下进行这样的比较:

  1. [...]
  2. 如果 x 为 null 且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是 String 并且 Type(y) 是 Number,则返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是 Boolean,则返回比较 ToNumber(x) == y 的结果。
  7. 如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是 String 或 Number 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 并且 Type(y) 是 String 或 Number,则返回 ToPrimitive(x) == y 的比较结果。
  10. 返回假。

但是,如果您使用严格的类型比较运算符===,则结果为 false,因为两种类型不同:

11.9.6 严格等式比较算法

比较 x === y,其中 x 和 y 是值,产生真或假。如下进行这样的比较:

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 未定义,则返回 true。
  3. 如果 Type(x) 为 Null,则返回 true。
  4. 如果 Type(x) 是 Number,那么
    1. 如果 x 是 NaN,则返回 false。
    2. 如果 y 是 NaN,则返回 false。
    3. 如果 x 与 y 的数值相同,则返回 true。
    4. 如果 x 为 +0 且 y 为 -0,则返回 true。
    5. 如果 x 为 -0 且 y 为 +0,则返回 true。
    6. 返回假。
  5. 如果 Type(x) 是 String,则如果 x 和 y 是完全相同的字符序列(相同的长度和对应位置的相同字符),则返回 true;否则,返回假。
  6. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回假。
  7. 如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。
于 2012-10-13T08:22:00.183 回答