协慌网

登录 贡献 社区

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

主持人注意:请拒绝编辑代码或删除此通知的冲动。空白模式可能是问题的一部分,因此不应该被不必要地篡改。如果您在 “空白无关紧要” 阵营,您应该能够接受原样。

是否有可能(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评估,以三个不同的值。

... 这仍然不意味着应该在实际代码中使用...