JavaScript:为什么[] ==![]?

Koe*_*err 8 javascript

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

我不明白这个结果.你能解释一下原因吗?

Zet*_*eta 10

[]是一个数组,但是![]是一个布尔值.每当您尝试比较具有不同类型的两个对象时,==两个对象都应转换为可比较的对象(使用ToNumber,请参阅11.9.3中的步骤7.).这就是为什么[] == ![]得到true,第一个空数组被求值的原因false.

11.9.3抽象等式比较算法

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

  1. [...]
  2. 如果x为null且y未定义,则返回true.
  3. 如果x未定义且y为null,则返回true.
  4. 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y).
  5. 如果Type(x)是String并且Type(y)是Number,则返回比较结果ToNumber(x)== y.
  6. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y.
  7. 如果Type(y)是布尔值,则返回比较结果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.

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

11.9.6严格的等式比较算法

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

  1. 如果Type(x)与Type(y)不同,则返回false.
  2. 如果Type(x)是Undefined,则返回true.
  3. 如果Type(x)为Null,则返回true.
  4. 如果Type(x)是Number,那么
    1. 如果x是NaN,则返回false.
    2. 如果y是NaN,则返回false.
    3. 如果x与y的Number值相同,则返回true.
    4. 如果x是+0且y是-0,则返回true.
    5. 如果x是-0且y是+0,则返回true.
    6. 返回false.
  5. 如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true; 否则,返回false.
  6. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true; 否则,返回false.
  7. 如果x和y引用同一个对象,则返回true.否则,返回false.