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

Sunshine_Lin發表於2021-12-29

大家好我是林三心,又一週過去了,哎,想想年紀又大了,就煩。今天突然有人問我:

(a == 1 && a == 2 && a ==3) 有可能是 true 嗎

我當時就想一腳踹過去,你這不是在耍我嗎?當我的腳離他的臉一釐米時,我突然發現,誒!好像有點意思哦

物件型別轉換

當兩個型別不同時進行==比較時,會將一個型別轉為另一個型別,然後再進行比較。 比如Object型別與Number型別進行比較時,Object型別會轉換為Number型別。 Object轉換為Number時,會嘗試呼叫Object.valueOf()Object.toString()來獲取對應的數字基本型別。
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.
var a = [1, 2, 3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3); // true

defineProperty

使用一個defineProperty,讓 a 的返回值為三個不同的值。
var val = 0;
Object.defineProperty(window, 'a', { // 這裡要window,這樣的話下面才能直接使用a變數去 ==
    get: function () {
        return ++val;
    }
});
console.log(a == 1 && a == 2 && a == 3) // true
你學廢了嗎?

結語

我是林三心,一個熱心的前端菜鳥程式設計師。如果你上進,喜歡前端,想學習前端,那我們們可以交朋友,一起摸魚哈哈,摸魚群,加我請備註【思否】

image.png

相關文章