在 JavaScript 中,我注意到[]==![]
结果是true
. 演示
我不明白这个结果。你能解释一下为什么吗?
[]
是一个数组,但是![]
是一个布尔值。每当您尝试比较具有不同类型的==
两个对象时,都应将两个对象转换为可比较的对象(使用ToNumber
,请参见 11.9.3 中的步骤 7.)。这就是为什么[] == ![]
产量为真,第一个空数组被评估为false
.
11.9.3 抽象等式比较算法
比较 x == y,其中 x 和 y 是值,产生真或假。如下进行这样的比较:
- [...]
- 如果 x 为 null 且 y 未定义,则返回 true。
- 如果 x 未定义且 y 为空,则返回 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,因为两种类型不同:
11.9.6 严格等式比较算法
比较 x === y,其中 x 和 y 是值,产生真或假。如下进行这样的比较:
- 如果 Type(x) 与 Type(y) 不同,则返回 false。
- 如果 Type(x) 未定义,则返回 true。
- 如果 Type(x) 为 Null,则返回 true。
- 如果 Type(x) 是 Number,那么
- 如果 x 是 NaN,则返回 false。
- 如果 y 是 NaN,则返回 false。
- 如果 x 与 y 的数值相同,则返回 true。
- 如果 x 为 +0 且 y 为 -0,则返回 true。
- 如果 x 为 -0 且 y 为 +0,则返回 true。
- 返回假。
- 如果 Type(x) 是 String,则如果 x 和 y 是完全相同的字符序列(相同的长度和对应位置的相同字符),则返回 true;否则,返回假。
- 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回假。
- 如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。