刷stackoverflow看到一个有趣的问题:
面试官问:在JavaScript中有可能让(a == 1 && a == 2 && a ==3)等于true吗?
你会怎么回答?
答案是有可能。
因为==是宽松/抽象相等,在进行比较的过程中可能会进行类型转换,而类型转换过程中调用的方法是可以修改的。
const a = {
i: 1,
toString: function () {
return a.i++;
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
复制代码
或者可以修改valueOf方法
const a = {
i: 1,
valueOf: function () {
return a.i++;
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
复制代码
附上一个宽松相等自动转换所有情况的表格:
你以为到这就结束了?并没有!
如果问题中是(a === 1 && a === 2 && a === 3)严格相等,那么还有可能?
答案仍然是有可能,甚至是在严格模式中。
(() => {
"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.");
}
})();
复制代码
参考:
本文探讨了JavaScript中(a==1&&a==2&&a==3)如何能为真,通过修改对象的toString或valueOf方法实现宽松相等。进一步讨论了在严格相等模式下这一命题的可能性。

被折叠的 条评论
为什么被折叠?



