JS中(a == 1 && a == 2 && a == 3)等于true?

刷stackoverflow看到一个有趣的问题:

面试官问:在JavaScript中有可能让(a == 1 && a == 2 && a ==3)等于true吗?

你会怎么回答?

答案是有可能。

因为==是宽松/抽象相等,在进行比较的过程中可能会进行类型转换,而类型转换过程中调用的方法是可以修改的。

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

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

或者可以修改valueOf方法

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

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

附上一个宽松相等自动转换所有情况的表格:

你以为到这就结束了?并没有!

如果问题中是(a === 1 && a === 2 && a === 3)严格相等,那么还有可能?

答案仍然是有可能,甚至是在严格模式中。

(() => {
	"use strict";
	Object.defineProperty(this, "a", {
	  "get": () => {
	    Object.defineProperty(this, "a", {
	      "get": () => {
	        Object.defineProperty(this, "a", {
	          "get": () => {
	            return 3;
	          }
	        });
	        return 2;
	      },
	      configurable: true
	    });
	    return 1;
	  },
	  configurable: true
	});
	if (a == 1 && a == 2 && a == 3) {
	  console.log("Yes, it’s possible.");
	}
})();
复制代码

参考:

Can (a ==1 && a== 2 && a==3) ever evaluate to true?

转载于:https://juejin.im/post/5a5ea76651882573256bd277

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值