博客 / 詳情

返回

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

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

(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

user avatar ziyeliufeng 頭像 esunr 頭像 codepencil 頭像 flymon 頭像 sunhengzhe 頭像 zhangxishuo 頭像 201926 頭像
7 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.