JavaScript (a == 1 && a == 2 && a == 3) 可能為 true 嗎?

簡評:你認為這個問題是一個好的面試題嗎?

在 JavaScript 中 (a ==1 && a== 2 && a==3) 可能為 true 嗎?

這個問題是國外一位求職者最近在面試一家大型科技公司時遇到的一個問題。

他的回答是「不可能」,而面試方說「nothing is impossible」,然后就沒有然后了。

雖然在實際工作中可能沒人會寫這樣的代碼,但題主還是放不下,苦思冥想了兩個禮拜,終于還是決定在 Stack Overflow 上尋求解答。

大家可以先自己想一想。

...

...

...

這里給一個最高贊的答案:

自定義 toString(或者 valueOf )方法,每次調(diào)用改變一次返回值,從而滿足判斷條件。

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

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

當(dāng)使用 == 時,如果兩個參數(shù)的類型不一樣,那么 JS 會嘗試將其中一個的類型轉(zhuǎn)換為和另一個相同。在這里左邊對象,右邊數(shù)字的情況下,會首先嘗試調(diào)用 valueOf(如果可以調(diào)用的話)來將對象轉(zhuǎn)換為數(shù)字,如果失敗,再調(diào)用 toString。

其實,還有很多其他的實現(xiàn),感興趣的可以點擊鏈接看看。

比如,我比較喜歡這個:

with({
  get a() {
    return Math.floor(Math.random()*4);
  }
}){
  for(var i=0;i<1000;i++){
    if (a == 1 && a == 2 && a == 3){
      console.log("after "+(i+1)+" trials, it becomes true finally!!!");
      break;
    }
  }
}

精選想法:
@Javen Fang
這個問題其實還是能考到對 Javascript 的基本理解的,而不是純粹為了玩。
其一,對于一個對象做比較有 valueOf/toString 的調(diào)用問題。
其二,JS 里一個變量背后經(jīng)常是一個 function。

問題:Can (a ==1 && a== 2 && a==3) ever evaluate to true?
reddit 討論:Javascript: Can (a ==1 && a== 2 && a==3) ever evaluate to true? ? r/programming
舊文推薦:2017 JavaScript 調(diào)查報告概述

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,569評論 0 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,659評論 19 139
  • 明媚的陽光照耀下蔥郁的樹林,被微風(fēng)吹拂的葉子發(fā)出沙沙聲響,時不時還能聽到鳥兒的歡鳴聲。 如果把步行換成躺在吊椅上睡...
    邵悅婷閱讀 549評論 0 0
  • SnackBar是 Android Support Library 22.2.0 里面新增提供的一個控件,可以把它...
    尹star閱讀 6,186評論 21 82
  • J叔漫畫,帶你看不一樣的星座 天秤座的那些癖好,你中了幾條? 對公平有著高度執(zhí)著的天秤座, 對英雄主義也有著蜜汁熱...
    J叔說星座閱讀 581評論 0 0

友情鏈接更多精彩內(nèi)容