刷stackoverflow看到一個有趣的問題:面試
面試官問:在JavaScript中有可能讓(a == 1 && a == 2 && a ==3)
等於true嗎?bash
你會怎麼回答?ui
答案是有可能。this
由於==
是寬鬆/抽象相等,在進行比較的過程當中可能會進行類型轉換,而類型轉換過程當中調用的方法是能夠修改的。lua
const a = {
i: 1,
toString: function () {
return a.i++;
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
複製代碼
或者能夠修改valueOf
方法spa
const a = {
i: 1,
valueOf: function () {
return a.i++;
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
複製代碼
附上一個寬鬆相等自動轉換全部狀況的表格:code
你覺得到這就結束了?並無!cdn
若是問題中是(a === 1 && a === 2 && a === 3)
嚴格相等,那麼還有可能?blog
答案仍然是有可能,甚至是在嚴格模式
中。ip
(() => {
"use strict";
Object.defineProperty(this, "a", {
"get": () => {
Object.defineProperty(this, "a", {
"get": () => {
Object.defineProperty(this, "a", {
"get": () => {
return 3;
}
});
return 2;
},
configurable: true
});
return 1;
},
configurable: true
});
if (a == 1 && a == 2 && a == 3) {
console.log("Yes, it’s possible.");
}
})();
複製代碼
參考: