3 回答
TA贡献1865条经验 获得超7个赞
如果你利用了它的==工作方式,你可以简单地创建一个带有自定义toString(或valueOf)函数的对象,该函数可以在每次使用时更改它返回的内容,使其满足所有三个条件。
const a = {
i: 1,
toString: function () {
return a.i++;
}}if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');}这种方法的原因是由于使用了松散的等式运算符。当使用松散相等时,如果其中一个操作数与另一个操作数的类型不同,则引擎将尝试将一个操作数转换为另一个操作数。如果左边是一个对象,右边是一个数字,它会尝试通过首先调用valueOf它来将对象转换为数字,如果它是可调用的,如果失败,它将调用toString。我toString在这种情况下使用的仅仅是因为它是我想到的,valueOf会更有意义。如果我改为返回一个字符串toString,那么引擎会尝试将字符串转换为一个数字,给出相同的最终结果,但路径稍长。
TA贡献2037条经验 获得超6个赞
我无法抗拒 - 其他答案无疑是正确的,但你真的无法超越以下代码:
var aᅠ = 1;var a = 2;var ᅠa = 3;if(aᅠ==1 && a== 2 &&ᅠa==3) {
console.log("Why hello there!")}请注意if语句中的奇怪间距(我从您的问题中复制)。它是半角度Hangul(对于那些不熟悉的人来说是朝鲜语),它是一个Unicode空格字符,ECMA脚本不将其解释为空格字符 - 这意味着它是标识符的有效字符。因此,有三个完全不同的变量,一个是在a之后的韩文,一个是之前的,另一个只是一个。_为了便于阅读,替换空格,相同的代码如下所示:
var a_ = 1;var a = 2;var _a = 3;if(a_==1 && a== 2 &&_a==3) {
console.log("Why hello there!")}查看Mathias的变量名称验证器上的验证。如果这个奇怪的间距实际上包含在他们的问题中,我确信这是这种答案的暗示。
不要这样做。认真。
编辑:我注意到(尽管不允许启动变量)零变宽连接器和零宽度非连接字符也允许在变量名中 - 请参阅使用零宽度字符混淆JavaScript - 优点和缺点?。
这将如下所示:
var a= 1;var a= 2; //one zero-width charactervar a= 3; //two zero-width characters (or you can use the other one)if(a==1&&a==2&&a==3) {
console.log("Why hello there!")}TA贡献1818条经验 获得超11个赞
有可能的!
var i = 0;with({
get a() {
return ++i;
}}) {
if (a == 1 && a == 2 && a == 3)
console.log("wohoo");}这在with语句中使用getter 来a评估三个不同的值。
...这仍然不意味着应该在实际代码中使用...
更糟糕的是,这个技巧也适用于===。
var i = 0;
with({
get a() {
return ++i;
}
}) {
if (a !== a)
console.log("yep, this is printed.");
}添加回答
举报
