對的你沒看錯,這是道很基礎的面試題,昨天剛好面試到了,沒答上出來。
[]==''返回?
直接說答案吧,返回是true
為什麼?
如果你看《Javascript權威指南第6版》的話,從75-76頁裡面關於==的轉換
上圖的意思就是
if (兩個運算元的型別是相同){
同嚴格相等的比較規則一樣(以下文會解釋嚴格相等的比較規則)
}
else if(兩個運算元的型別不相同){
if(null == undefined) {
return true;
}else if(a是數字,b是字串){
將字串轉換為數字,然後使用轉換後的值進行比較。
}else if(兩個值中有一個是true的話){
將其轉換為1再進行比較
}else if(兩個值中有一個是false的話){
將其轉換為0再進行比較
}else if(如果一個值是物件,另一個值是數字或字串){
將物件轉換為原始值,轉換規則在《Javascript權威指南第6版》書52頁已經說明,下文具體說到物件轉換為原始值的步驟
}
}
複製程式碼
綜合上文所說,[]=='' 屬於最後一種情況.
物件轉換為原始值步驟
- 物件轉換到布林值
直接將物件轉成true
複製程式碼
- 物件轉換到字串
if(物件具有tostring()方法){
如果返回一個原始值,javascript將這個值轉換為字串,並返回這個字串結果。
}else if(物件具有valueOf()方法){
會呼叫valueOf()方法.將其結果返回
}else{
丟擲異常
}
複製程式碼
- 物件轉換到數字
if(物件具有valueOf()方法){
會呼叫valueOf()方法.將其結果返回
}else if(物件具有tostring()方法){
如果返回一個原始值,javascript將這個值轉換為字串,並返回這個字串結果。
}else{
丟擲異常
}
複製程式碼
注意對於空陣列以及單個元素的陣列會轉換成一個數字。陣列繼承了預設的valueOf()方法,這個方法返回一個物件而不是一個原始值,因此陣列到數字的轉換則呼叫toString()方法。空陣列轉換成為空字串,空字串轉換成為數字0.——來自《javascript權威指南》第55頁。
嚴格相等的比較規則
上圖的意思是
if (兩個值型別不相同){
return false;
}
else if(null/undefined/true/false){
return true
}else if(兩個值其中之一為NaN){
return false;
}else if(兩個值都為數值且值相等){
return true;
}else if(兩個值都為字串且值相等 ){
return true;
}else if(兩個值都指向同一個引用型別 ){
return true;
}
複製程式碼
常見的==比較例子
123 == 123; //true
'123' == 123; //true,'123'會轉成成數值123
false == 0; //true,false 轉成數值就是0
'a' == 'A'; //false,轉換後的編碼不一樣
123 == {}; //false,valueOf()會改變
123 == NaN; //false,只要有NaN,都是false
{} == {}; //false,比較的是他們的地址,每個新建立物件的引用地址都不同
null == undefined //true
'NaN' == NaN //false
123 == NaN //false
NaN == NaN //false
false == 0 //true
true == 1 //true
true == 2 //false
undefined == 0 //false
null == 0 //false
'123' == 123 //true
'123' === 123 //false
複製程式碼
結論:
[]=='',首先操作的是將[]轉轉換成空字串,空字串再轉換成數字0,0再跟‘’比較,將''轉成0,所以最終返回的是true
參考資料
《javascript權威指南》