根据ECMAScript® Language Specification的第 11.9.3 节,任何比较都按如下方式进行:==
- 如果 Type(x) 与 Type(y) 相同,则
- 如果 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。否则,返回假。
- 如果 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 的比较结果。
- 返回假。
在第一步中,ToNumber()
应用于false
并产生Number(0)
。在第二步中,规则#9 适用ToPrimitive()
于空数组并产生""
,转换为数值,也变成Number(0)
了。
另外,第 9.2 节说明了在表达式中使用对象:
根据下表,抽象操作ToBoolean
将其参数转换为布尔类型的值:
- 未定义 -> 假
- 空 -> 假
- Boolean -> 结果等于输入参数(无转换)。
- Number -> 如果参数为 +0、-0 或 NaN,则结果为 false;否则结果为真。
- String -> 如果参数是空字符串(其长度为零),则结果为假;否则结果为真。
- 对象->真