你們好我是林三心,又一週過去了,哎,想一想年紀又大了,就煩。今天忽然有人問我:web
(a == 1 && a == 2 && a ==3) 有多是 true 嗎
數組
我當時就想一腳踹過去,你這不是在耍我嗎?當個人腳離他的臉一釐米時,我忽然發現,誒!好像有點意思哦markdown
當兩個類型不一樣時進行==比較時,會將一個類型轉爲另外一個類型,而後再進行比較。 好比
Object
類型與Number
類型進行比較時,Object
類型會轉換爲Number
類型。Object
轉換爲Number
時,會嘗試調用Object.valueOf()
和Object.toString()
來獲取對應的數字基本類型。app
var a = {
i: 1,
toString: function () {
return a.i++;
}
}
console.log(a == 1 && a == 2 && a == 3) // true
複製代碼
與上面這個類型轉換同樣,數組調用
toString()
會隱含調用Array.join()
方法 而數組shift
方法的用法:shift()
方法用於把數組的第一個元素從其中刪除,並返回第一個元素的值。若是數組是空的,那麼shift()
方法將不進行任何操做,返回undefined
值。請注意,該方法不建立新數組,而是直接修改原有的 數組。 因此咱們能夠看到a == 1
時會調用toString()
,toString()
調用join()
,join()
等於shift
,則轉換爲Number
類型後爲1.ui
var a = [1, 2, 3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3); // true
複製代碼
使用一個
defineProperty
,讓a
的返回值爲三個不一樣的值。spa
var val = 0;
Object.defineProperty(window, 'a', { // 這裏要window,這樣的話下面才能直接使用a變量去 ==
get: function () {
return ++val;
}
});
console.log(a == 1 && a == 2 && a == 3) // true
複製代碼
你學廢了嗎?code