[]
是一个数组,但![]
是一个布尔值。当你使用==
比较两个类型不同的对象时,两个对象都应该被转换为可比较的对象(使用ToNumber
,参见11.9.3中的第7步)。这就是为什么[] == ![]
的结果为true,因为第一个空数组被评估为false
。
11.9.3抽象相等比较算法
比较x == y,其中x和y是值,产生true或false。此类比较执行如下:
- [...]
- 如果x是null且y是undefined,则返回true。
- 如果x是undefined且y是null,则返回true。
- 如果Type(x)是Number且Type(y)是String,则返回比较x == ToNumber(y)的结果。
- 如果Type(x)是String且Type(y)是Number,则返回比较ToNumber(x) == y的结果。
- 如果Type(x)是Boolean,则返回比较ToNumber(x) == y的结果。
- 如果Type(y)是Boolean,则返回比较x == ToNumber(y)的结果。
- 如果Type(x)是String或Number且Type(y)是Object,则返回比较x == ToPrimitive(y)的结果。
- 如果Type(x)是Object且Type(y)是String或Number,则返回比较ToPrimitive(x) == y的结果。
- 返回false。
但是,如果使用严格相等运算符===
,则结果为false,因为两种类型不同:
11.9.6 严格相等比较算法
比较 x === y,其中 x 和 y 是值,会产生 true 或 false。这样的比较按以下方式执行:
- 如果 Type(x) 与 Type(y) 不同,则返回 false。
- 如果 Type(x) 是 Undefined,则返回 true。
- 如果 Type(x) 是 Null,则返回 true。
- 如果 Type(x) 是 Number,则
- 如果 x 是 NaN,则返回 false。
- 如果 y 是 NaN,则返回 false。
- 如果 x 是与 y 相同的 Number 值,则返回 true。
- 如果 x 是 +0,且 y 是 -0,则返回 true。
- 如果 x 是 -0,且 y 是 +0,则返回 true。
- 否则返回 false。
- 如果 Type(x) 是 String,则仅当 x 和 y 完全相同(长度相同,在对应位置上的字符也相同)时,返回 true;否则,返回 false。
- 如果 Type(x) 是 Boolean,则仅当 x 和 y 都为 true 或都为 false 时,返回 true;否则,返回 false。
- 如果 x 和 y 引用同一对象,则返回 true。否则,返回 false。
[]==![]
发生的是 []
和 ![]
之间的抽象相等比较。请注意,typeof(![])
是 boolean
,而 typeof([])
是 object
。根据文档:对于 x == y,如果 Type(y) 是 Boolean,则返回比较 x == ToNumber(y) 的结果。![]
的 ToNumber 是 false
,其值为 0。因此,可以得出以下结论:[] == 0
而 []==0
的结果是 true
。 - Jacob George[]
、[""]
、[null]
和[undefined]
仍然变成了''
,而且'' == 0
是true
。但是,["", ""]
变成了,
,而,
不等于0,因为ToNumber(',')
计算结果为NaN
。 - Antti Haapala -- Слава Україні
[]
和! []
,回答了这个问题。 - zengr[] !== []
混淆。 - Oriol