如果你趁如何==
工作,你可以简单地创建一个自定义的对象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
,则引擎将尝试将该字符串转换为一个数字,使我们得到相同的最终结果,尽管路径略长。