[]==''返回?為什麼?運算子==進行了什麼操作?

tony1475333400936發表於2018-12-08

對的你沒看錯,這是道很基礎的面試題,昨天剛好面試到了,沒答上出來。

[]==''返回?

直接說答案吧,返回是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頁已經說明,下文具體說到物件轉換為原始值的步驟
    }
    
}

複製程式碼

綜合上文所說,[]=='' 屬於最後一種情況.

物件轉換為原始值步驟

  1. 物件轉換到布林值
直接將物件轉成true
複製程式碼
  1. 物件轉換到字串
if(物件具有tostring()方法){
    如果返回一個原始值,javascript將這個值轉換為字串,並返回這個字串結果。
}else if(物件具有valueOf()方法){
    會呼叫valueOf()方法.將其結果返回
}else{
    丟擲異常
}
複製程式碼
  1. 物件轉換到數字
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; //truefalse 轉成數值就是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權威指南》

溫故js系列(9)-相等==&嚴格相等===&程式碼裡的那些判斷

相關文章