簡評:你認為這個問題是一個好的面試題嗎?
在 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)查報告概述