Type(x) |
Type(y) |
Result |
type(x)==type(y) |
x===y |
otherwise... |
false |
null |
undefined |
true |
undefined |
null |
true |
Number |
String |
x==toNumber(y) |
String |
Number |
toNumber(x)==y |
Boolean |
(any) |
toNumber(x)==y |
(any) |
Boolean |
x==toNumber(y) |
String or Number |
Object |
x==toPrimitive(y) |
Object |
String or Number |
toPrimitive(x)==y |
例子一:
[0]==ture;
首先會把ture進行toNumber,結果為1,式子及轉化為 [0]==1
然後[0]會被toString(),結果為“0”,式子轉化為“0”==1
接著“0”會被toNumber(),結果為0,式子轉化為0==1
最後根據type(x)==type(y),式子轉化為0===1
所以[0]==true會得到false
例子二:
“potato”==true;
首先true會被toNumber,結果為1,式子轉化為“potato”==1
然後“potato”會被toNumber,結果為NaN,式子轉化為NaN==1
根據typeof(x)==typeof(y),式子轉化為NaN===1
所以“potato”==true會得到false
例子三:
object with getValue
str = new Number(1);
str.toString = function(){return "2"};
str==1;
這裡typeof str == "object",所以對str進行toPrimitive,這裡會對str進行valueOf取值得到1
所以式子轉化為1==1
所以str==1得到true
例子四:
object with toString
var obj = {
toString : function(){return "2"}
};
obj==1
這裡typeof obj == "object",對obj進行toPrimitive,首先進行valueOf得到object,繼續進行toString()得到“2”,式子專為"2"==1
對“2”進行toNumber得到2,式子轉為2==1
所以obj==1得到false
例子5:
[]==[]
左右是不同的對象,所以false
![]==[]
首先![]==false,這裡[]是一個即存在的對象,若將其強制專為bool類型,通過!![]得到ture,所以![]==false,此時式子專為false==[]
然後false專為0,式子專為0==[]
然後[]專為"",式子專為0==“”
然後""轉為0,式子專為0==0
所以![]==[]得到true
例子6:
!{}=={}
首先!{}專為false,規則和5一樣,式子轉為false=={}
false專為0,式子轉為0=={}
對{}進行toPrimitive得到"[object Object]",式子專為0=="[object Object]"
對"[object Object]"進行toNumber得到NaN,式子專為0==NaN
所以!{}=={}得到 false