JavaScript (a == 1 && a == 2 && a == 3) 可能为 true 吗?

简评:你认为这个问题是一个好的面试题吗?

在 JavaScript 中 (a ==1 && a== 2 && a==3) 可能为 true 吗?

这个问题是国外一位求职者最近在面试一家大型科技公司时遇到的一个问题。

他的回答是「不可能」,而面试方说「nothing is impossible」,然后就没有然后了。

虽然在实际工作中可能没人会写这样的代码,但题主还是放不下,苦思冥想了两个礼拜,终于还是决定在 Stack Overflow 上寻求解答。

大家可以先自己想一想。

...

...

...

这里给一个最高赞的答案:

自定义 toString(或者 valueOf )方法,每次调用改变一次返回值,从而满足判断条件。

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

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

当使用 == 时,如果两个参数的类型不一样,那么 JS 会尝试将其中一个的类型转换为和另一个相同。在这里左边对象,右边数字的情况下,会首先尝试调用 valueOf(如果可以调用的话)来将对象转换为数字,如果失败,再调用 toString。

其实,还有很多其他的实现,感兴趣的可以点击链接看看。

比如,我比较喜欢这个:

with({
  get a() {
    return Math.floor(Math.random()*4);
  }
}){
  for(var i=0;i<1000;i++){
    if (a == 1 && a == 2 && a == 3){
      console.log("after "+(i+1)+" trials, it becomes true finally!!!");
      break;
    }
  }
}

精选想法:
@Javen Fang
这个问题其实还是能考到对 Javascript 的基本理解的,而不是纯粹为了玩。
其一,对于一个对象做比较有 valueOf/toString 的调用问题。
其二,JS 里一个变量背后经常是一个 function。

问题:Can (a ==1 && a== 2 && a==3) ever evaluate to true?
reddit 讨论:Javascript: Can (a ==1 && a== 2 && a==3) ever evaluate to true? • r/programming
旧文推荐:2017 JavaScript 调查报告概述

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,714评论 0 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 明媚的阳光照耀下葱郁的树林,被微风吹拂的叶子发出沙沙声响,时不时还能听到鸟儿的欢鸣声。 如果把步行换成躺在吊椅上睡...
    邵悦婷阅读 3,427评论 0 0
  • SnackBar是 Android Support Library 22.2.0 里面新增提供的一个控件,可以把它...
    尹star阅读 11,275评论 21 82
  • J叔漫画,带你看不一样的星座 天秤座的那些癖好,你中了几条? 对公平有着高度执着的天秤座, 对英雄主义也有着蜜汁热...
    J叔说星座阅读 3,483评论 0 0

友情链接更多精彩内容