[]==''返回?爲何?運算符==進行了什麼操做?

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

[]==''返回?

直接說答案吧,返回是truejava

爲何?

若是你看《Javascript權威指南第6版》的話,從75-76頁裏面關於==的轉換面試

上圖的意思就是segmentfault

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頁。bash

嚴格相等的比較規則

上圖的意思是ui

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)-相等==&嚴格相等===&代碼裏的那些判斷spa

相關文章
相關標籤/搜索