为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

元芳怎么了 2019-07-25 10:39:20
可以(a == 1 && a == 2 && a == 3)评估为真吗?是否有可能在JavaScript中(a== 1 && a ==2 && a==3)进行评估true?这是一家大型科技公司提出的面试问题。它发生在两周前,但我仍在努力寻找答案。我知道我们从来没有在日常工作中写过这样的代码,但我很好奇。
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

如果你利用了它的==工作方式,你可以简单地创建一个带有自定义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,那么引擎会尝试将字符串转换为一个数字,给出相同的最终结果,但路径稍长。


查看完整回答
反对 回复 2019-07-25
?
阿晨1998

TA贡献2037条经验 获得超6个赞

我无法抗拒 - 其他答案无疑是正确的,但你真的无法超越以下代码:

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之后的韩文,一个是之前的,另一个只是一个。_为了便于阅读,替换空格,相同的代码如下所示:

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


查看完整回答
反对 回复 2019-07-25
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

有可能的!

var i = 0;with({
  get a() {
    return ++i;
  }}) {
  if (a == 1 && a == 2 && a == 3)
    console.log("wohoo");}

这在with语句中使用getter 来a评估三个不同的值。

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

更糟糕的是,这个技巧也适用于===

 var i = 0;

  with({
    get a() {
      return ++i;
    }
  }) {
    if (a !== a)
      console.log("yep, this is printed.");
  }


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 620 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号