(a ==1 && a== 2 && a==3) 有多是 true 嗎?

類型轉換帶給個人啓發

在前端博客羣裏的面試題學到的東西,何時 a ==1 && a== 2 && a==3 爲 true?前端

解法一:對象類型轉換

var a = {
    i:1,
    toString:function(){
        return a.i++;
    }
}
複製代碼

當兩個類型不一樣時進行==比較時,會將一個類型轉爲另外一個類型,而後再進行比較。git

好比Object類型與Number類型進行比較時,Object類型會轉換爲Number類型。github

對象轉換爲Number時,會嘗試調用Object.valueOf()和Object.toString()來獲取對應的數字基本類型。面試

解法二:數組類型轉換

var a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);
複製代碼

與上面這個類型轉換同樣,數組調用toString()會隱含調用Array.join()方法數組

而數組shift方法的用法:shift() 方法用於把數組的第一個元素從其中刪除,並返回第一個元素的值。若是數組是空的,那麼 shift() 方法將不進行任何操做,返回 undefined 值。請注意,該方法不建立新數組,而是直接修改原有的 arrayObject。ui

因此咱們能夠看到 a==1時會調用toString(),toString()調用join(),join()等於shift,則轉換爲Number類型後爲1.spa

解法三:定義a的get

var val = 0;
Object.defineProperty(window, 'a', {
  get: function() {
    return ++val;
  }
});
console.log(a == 1 && a == 2 && a == 3);
複製代碼

使用一個get,讓 a 的返回值爲三個不一樣的值。code

更多面試題來這裏看看:github.com/kujian/dail…cdn

個人公衆號,每日更新全網好文章,能夠來看看對象

相關文章
相關標籤/搜索