刷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.");
}
})();
复制代码
参考: