版主注意:请抵制编辑代码或删除此通知的冲动。空白的模式可能是问题的一部分,因此不应被不必要地篡改。如果您在“空白是微不足道的”阵营中,您应该能够按原样接受代码。
有没有可能在 JavaScript中(a== 1 && a ==2 && a==3)进行评估?true
(a== 1 && a ==2 && a==3)
true
这是一家大型科技公司提出的面试问题。它发生在两周前,但我仍在努力寻找答案。我知道我们在日常工作中从未编写过这样的代码,但我很好奇。
如果您利用how ==works,您可以简单地创建一个具有自定义toString(或valueOf)函数的对象,该函数会在每次使用时更改返回的内容,从而满足所有三个条件。
==
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 之后,一个是在它之前,最后一个是只有 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!") }