根据section 11.9.3的ECMAScript® Language Specification,任何==
比较都按如下方式进行:
- 如果Type(x)与Type(y)相同,那么
- 如果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完全相同的字符序列(相应位置的长度和字符相同),则返回true。否则,返回false。
- 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true。否则,返回false。
- 如果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。
醇>
在第一步中,ToNumber()
适用于false
并产生Number(0)
。在第二步中,规则#9将ToPrimitive()
应用于空数组并生成""
,其转换为数值,也变为Number(0)
。
另外section 9.2说明了在表达式中使用对象:
抽象操作ToBoolean
根据此表将其参数转换为Boolean类型的值:
- 未定义 - >假
- Null - >假
- 布尔值 - >结果等于输入参数(无转换)。
- 数字 - >如果参数为+ 0,-0或NaN,则结果为false;否则结果是真的。
- 字符串 - >如果参数为空String(其长度为零),则结果为false;否则结果是真的。
- 对象 - >真强>
这是因为JS中的==
强制转换,如果一个类型可以转换为另一个类型,则返回值为true
,这里因为[]
无法更改或与bool进行比较,所以false
其中if([])
检查null
和undefined
值,因为[]既不为null也未定义,它返回true
检查一下
Which equals operator (== vs ===) should be used in JavaScript comparisons?