在JavaScript中,我注意到[]==![]
结果为true
。 demo
我不明白这个结果。你能解释一下原因吗?
答案 0 :(得分:10)
[]
是一个数组,但![]
是一个布尔值。每当您尝试将具有不同类型的两个对象与==
进行比较时,两个对象都应转换为可比对象(使用ToNumber
,请参阅11.9.3中的步骤7.)。这就是[] == ![]
产生true的原因,第一个空数组被评估为false
。
11.9.3 The Abstract Equality Comparison Algorithm
比较x == y,其中x和y是值,产生true或false。这样的比较如下进行 如下:
- [...]
- 如果x为null且y未定义,则返回true。
- 如果x未定义且y为null,则返回true。
- 如果Type(x)是Number而Type(y)是String, 返回比较结果x == ToNumber(y)。
- 如果Type(x)是String而Type(y)是Number, 返回比较结果ToNumber(x)== y。
- 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
- 如果Type(y)是布尔值,则返回比较结果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 The Strict Equality Comparison Algorithm
比较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的数值相同,则返回true。
- 如果x为+0且y为-0,则返回true。
- 如果x是-0且y是+0,则返回true。
- 返回false。
- 如果Type(x)是String,则如果x和y完全相同的字符序列(相同的长度和 相应位置的相同字符);否则,返回false。
- 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true;否则,返回false。
- 如果x和y引用同一个对象,则返回true。否则,返回false。
醇>