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

  UndefinedNullNumberStringBooleanObject
Operand AUndefinedtruetruefalsefalsefalsefalse
Nulltruetruefalsefalsefalsefalse
NumberfalsefalseA === BA === ToNumber(B)A === ToNumber(B)A == ToPrimitive(B)
StringfalsefalseToNumber(A) === BA === BToNumber(A) === ToNumber(B)A == ToPrimitive(B)
BooleanfalsefalseToNumber(A) === BToNumber(A) === ToNumber(B)A === BToNumber(A) == ToPrimitive(B)
ObjectfalsefalseToPrimitive(A) == BToPrimitive(A) == BToPrimitive(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.

undefinedundefinedtruetruetrue
nullnulltruetruetrue
truetruetruetruetrue
falsefalsetruetruetrue
'foo''foo'truetruetrue
00truetruetrue
+0-0truetruefalse
0falsetruefalsefalse
""falsetruefalsefalse
""0truefalsefalse
'0'0truefalsefalse
'17'17truefalsefalse
[1, 2]'1,2'truefalsefalse
new String('foo')'foo'truefalsefalse
nullundefinedtruefalsefalse
nullfalsefalsefalsefalse
undefinedfalsefalsefalsefalse
{ foo: 'bar' }{ foo: 'bar' }falsefalsefalse
new String('foo')new String('foo')falsefalsefalse
0nullfalsefalsefalse
0NaNfalsefalsefalse
'foo'NaNfalsefalsefalse
NaNNaNfalsefalsetrue
05-24 19:45