小编典典

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

javascript

版主注意:请抵制编辑代码或删除此通知的冲动。空白的模式可能是问题的一部分,因此不应被不必要地篡改。如果您在“空白是微不足道的”阵营中,您应该能够按原样接受代码。

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

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


阅读 257

收藏
2022-01-30

共2个答案

小编典典

如果您利用how ==works,您可以简单地创建一个具有自定义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,那么引擎会尝试将该字符串转换为一个数字,从而为我们提供相同的最终结果,尽管路径稍长。

2022-01-30
小编典典

其他答案无疑是正确的,但你真的不能跳过以下代码:

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 之后,一个是在它之前,最后一个是只有 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!")
}
2022-01-30