Can (a ==1 && a== 2 && a==3) ever evaluate to 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。

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

比如一个很黑科技但更有趣的解法是:
var aᅠ = 1;
var a = 2;
var ᅠa = 3;
if(aᅠ==1 && a== 2 &&ᅠa==3) {
    console.log("Why hello there!")
}
此解法需要注意if里面的格式哦~


作者:Hevin
链接:https://zhuanlan.zhihu.com/p/33029291
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值