Strict equality using ===
比较之前不转换类型,
如果不同类型,不相等,
如果相同类型:如果两个都不是numbers,只有自己和自己比较才相等,其他都不相等;
如果两个都是numbers,两个有相同的值(都不是NaN)或者一个是 +0 另一个是-0才相等,其他都不相等。(The only case in which (x !== x) is true is when x is NaN.)
Loose equality using ==
两个值转换为一个common type(一个或者两个可能经过转换),
后面的比较和 === 相同。
Undefined | Null | Number | String | Boolean | Object | ||
Operand A | Undefined | true | true | false | false | false | false |
Null | true | true | false | false | false | false | |
Number | false | false | A === B | A === ToNumber(B) | A === ToNumber(B) | A == ToPrimitive(B) | |
String | false | false | ToNumber(A) === B | A === B | ToNumber(A) === ToNumber(B) | A == ToPrimitive(B) | |
Boolean | false | false | ToNumber(A) === B | ToNumber(A) === ToNumber(B) | A === B | ToNumber(A) == ToPrimitive(B) | |
Object | false | false | ToPrimitive(A) == B | ToPrimitive(A) == B | ToPrimitive(A) == ToNumber(B) | A === B |
ToNumber(A)试着在比较前转换它的参数为一个number,行为等价于 +A;
ToPrimitive(A)试着在比较前转换它的参数为 a primitive value,试着调用A的一系列方法A.toString()和A.valueOf()。
Same-value equality
whether two values are functionally identical in all contexts.
undefined | undefined | true | true | true |
null | null | true | true | true |
true | true | true | true | true |
false | false | true | true | true |
'foo' | 'foo' | true | true | true |
0 | 0 | true | true | true |
+0 | -0 | true | true | false |
0 | false | true | false | false |
"" | false | true | false | false |
"" | 0 | true | false | false |
'0' | 0 | true | false | false |
'17' | 17 | true | false | false |
[1, 2] | '1,2' | true | false | false |
new String('foo') | 'foo' | true | false | false |
null | undefined | true | false | false |
null | false | false | false | false |
undefined | false | false | false | false |
{ foo: 'bar' } | { foo: 'bar' } | false | false | false |
new String('foo') | new String('foo') | false | false | false |
0 | null | false | false | false |
0 | NaN | false | false | false |
'foo' | NaN | false | false | false |
NaN | NaN | false | false | true |