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?

相關文章
相關標籤/搜索