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(一个或者两个可能经过转换),
后面的比较和 === 相同。
Operand B | |||||||
---|---|---|---|---|---|---|---|
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.
x | y | == | === | Object.is |
---|---|---|---|---|
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 |