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

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

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

你会怎么回答?ui

答案是有可能。this

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

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

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

或者能够修改valueOf方法spa

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

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

附上一个宽松相等自动转换全部状况的表格:code

你觉得到这就结束了?并无!cdn

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

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

(() => {
	"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?

相关文章
相关标签/搜索