(a== 1 && a ==2 && a==3) 能评估为真吗?

2022-08-29 21:50:09

主持人注:请抵制编辑代码或删除此声明的冲动。空格的模式可能是问题的一部分,因此不应不必要地篡改。如果您处于“空格无关紧要”的阵营中,您应该能够按原样接受代码。

有没有可能在JavaScript中评估到?(a== 1 && a ==2 && a==3)true

这是一家大型科技公司提出的面试问题。它发生在两周前,但我仍然在努力寻找答案。我知道我们在日常工作中从来不会写这样的代码,但我很好奇。


答案 1

如果您利用 == 的工作原理,则可以简单地创建一个具有自定义(或)函数的对象,该函数每次使用时更改它返回的内容,使其满足所有三个条件。toStringvalueOf

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

这之所以有效,是因为使用了松散相等运算符。使用松散相等时,如果其中一个操作数与另一个操作数的类型不同,则引擎将尝试将一个操作数转换为另一个操作数。对于左侧的对象和右侧的数字,它将尝试将对象转换为数字,如果该对象是可调用的,则首先调用该对象,否则,它将调用 。我在这种情况下使用只是因为它是想到的,会更有意义。如果我从 返回一个字符串,引擎会尝试将字符串转换为一个数字,从而得到相同的最终结果,尽管路径稍长。valueOftoStringtoStringvalueOftoString


答案 2

我无法抗拒 - 其他答案无疑是正确的,但你真的不能走过下面的代码:

var aᅠ = 1;
var a = 2;
var ᅠa = 3;
if(aᅠ==1 && a== 2 &&ᅠa==3) {
    console.log("Why hello there!")
}

请注意语句中奇怪的间距(我从您的问题中复制的)。它是半角韩文(对于那些不熟悉的人来说是韩语),这是一个Unicode空格字符,没有被ECMA脚本解释为空格字符 - 这意味着它是标识符的有效字符。因此,有三个完全不同的变量,一个是韩文在a之后,一个是之前的,最后一个是只有a的。为了便于阅读,将空格替换为,相同的代码将如下所示:if_

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!")
}