在前端博客羣裏的面試題學到的東西,何時 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
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
個人公衆號,每日更新全網好文章,能夠來看看對象