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

740 阅读1分钟

刷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?