鍍金池/ 問(wèn)答/HTML/ 為何 a==1 && a==2 && a==3

為何 a==1 && a==2 && a==3 為true?

這是在面試題里看到的,原文是說(shuō)如何讓a==1 && a==2 && a==3 為true?
以下是答案:

let a = [3, 2, 1]
a.__proto__.toString = function() {
    return a.pop()
}

打印console.log(a==1 && a==2 && a==3)結(jié)果真為true;

朋友說(shuō)==進(jìn)行隱式轉(zhuǎn)換,調(diào)用了toString方法,但是還不大清楚,所以請(qǐng)各位前輩指教

回答
編輯回答
賤人曾
  1. a==1,調(diào)用a.valueOf(),跟1不等,再調(diào)用a.toString(),得到1,與1相等,返回true,繼續(xù)往后,此時(shí)a=[3,2]
  2. a==2,同上,繼續(xù)往后,此時(shí)a=[3]
  3. a==3,同上,得到true
2017年4月17日 13:11
編輯回答
編輯回答
傻丟丟

==判斷,一邊為Number類型,則會(huì)把兩邊都進(jìn)行一個(gè)數(shù)值轉(zhuǎn)換,數(shù)值轉(zhuǎn)換會(huì)先調(diào)用valueOf函數(shù),數(shù)組調(diào)用valueOf后返回的還是數(shù)組本身,就會(huì)再次調(diào)用toString函數(shù),而

a.__proto__.toString = function() {
    return a.pop()
}

重寫了a的toString函數(shù),所以打印的語(yǔ)句可以看成

console.log((a.pop())==1 && (a.pop())==2 && (a.pop())==3)
//pop是從數(shù)組末尾彈出最后一個(gè)元素,修改原數(shù)組,并返回彈出的元素
//所以 (a.pop())==1 ==>  1==1 然后a變成[3,2],以此類推2,3也是如此
2018年1月10日 04:48
編輯回答
朽鹿

我只是一個(gè)搬運(yùn)工
can-a-1-a-2-a-3-ever-evaluate-to-true

復(fù)制代碼并運(yùn)行 -.-
var a= 1;
var a?= 2;
var a??= 3;
if(a==1&&a?==2&&a??==3) {
    console.log("Why hello there!")
}
2017年10月11日 02:44
編輯回答
凹凸曼

算術(shù)運(yùn)算符優(yōu)先級(jí)吧 == 的運(yùn)算優(yōu)先級(jí)低于 &&
a==1&&a==2&&a==3
實(shí)際運(yùn)算順序是
a==(1&&a==(2&&a==3))
所以a=3就可以滿足結(jié)果為true

2018年7月1日 01:33
編輯回答
野橘

這個(gè)問(wèn)題其實(shí)還是能考到對(duì) Javascript 的基本理解的,而不是純粹為了玩。
其一,對(duì)于一個(gè)對(duì)象做比較有 valueOf/toString 的調(diào)用問(wèn)題。
其二,JS 里一個(gè)變量背后經(jīng)常是一個(gè) function。
自定義 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í),如果兩個(gè)參數(shù)的類型不一樣,那么 JS 會(huì)嘗試將其中一個(gè)的類型轉(zhuǎn)換為和另一個(gè)相同。在這里左邊對(duì)象,右邊數(shù)字的情況下,會(huì)首先嘗試調(diào)用 valueOf(如果可以調(diào)用的話)來(lái)將對(duì)象轉(zhuǎn)換為數(shù)字,如果失敗,再調(diào)用 toString。

2017年12月10日 22:49