主持人注意:请拒绝编辑代码或删除此通知的冲动。空白模式可能是问题的一部分,因此不应该被不必要地篡改。如果您在 “空白无关紧要” 阵营,您应该能够接受原样。
是否有可能(a== 1 && a ==2 && a==3)
可以在 JavaScript 中评估为true
?
这是一家大型科技公司提出的面试问题。它发生在两周前,但我仍在努力寻找答案。我知道我们从未在日常工作中写过这样的代码,但我很好奇。
如果您利用==
如何工作 ,您可以简单地创建一个具有自定义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
返回一个字符串,那么引擎会尝试将字符串转换为一个数字,给出相同的最终结果,但路径稍长。
我无法抗拒 - 其他答案无疑是正确的,但你真的无法超越以下代码:
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 之后的 Hangul,一个是在它之前,最后一个只是 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 character
var 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!")
}
有可能的!
var i = 0;
with({
get a() {
return ++i;
}
}) {
if (a == 1 && a == 2 && a == 3)
console.log("wohoo");
}
它使用一个 getter 的内部with
的语句让a
评估,以三个不同的值。
... 这仍然不意味着应该在实际代码中使用...