「百毒不侵(一)」(a == 1 && a == 2 && a == 3) 有多是 true 嗎?

image.png

你們好我是林三心,又一週過去了,哎,想一想年紀又大了,就煩。今天忽然有人問我: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

使用一個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

相關文章
相關標籤/搜索