[TOC] #### 1. 前言 --- 下面這道題是 **阿里、百度、騰訊** 三個(gè)大廠都出過的面試題,一個(gè)前端同事跳槽面試也被問了這道題 ```javascript // ? 位置應(yīng)該怎么寫,才能輸出 true const a = ? console.log(a == 1 && a == 2 && a == 3) ``` 看了大廠的面試題會(huì)對(duì)面試官的精神狀態(tài)陷入深深的懷疑,就感覺不太正常,平時(shí)誰(shuí)會(huì)這樣寫代碼。但是呢,很多事經(jīng)不住細(xì)想,細(xì)想后,好像還是有點(diǎn)道理的。 這道題考的知識(shí)點(diǎn)是 **== 運(yùn)算符**的規(guī)則以及類型轉(zhuǎn)換的規(guī)則,當(dāng)問及到 **==** 和 **===** 的區(qū)別時(shí),相信你會(huì)脫口而出:兩個(gè)等號(hào)只比較值,三個(gè)等號(hào)比較值和類型,這樣回答說不錯(cuò),但過于簡(jiǎn)單。當(dāng)不同類型的數(shù)據(jù)進(jìn)行兩個(gè)等號(hào)比較時(shí),它是怎么進(jìn)行比較的,你真的清楚嗎?本文將詳細(xì)描述它的比較規(guī)則 #### 2. 比較規(guī)則 --- 兩個(gè)等號(hào) **==** 運(yùn)算符比較規(guī)則如下所示: ![](https://img.itqaq.com/art/content/e1e012dcddbbd4e7efa1c2025b959f2d.png) 示例:參考上圖,在進(jìn)行比較時(shí),對(duì)象先轉(zhuǎn)為原始類型再進(jìn)行比較。轉(zhuǎn)為原始類型,先調(diào)用 valueOf() 方法轉(zhuǎn)換,如果無(wú)法轉(zhuǎn)為原始類型,再調(diào)用 toString() 方法進(jìn)行比較 valueOf() 是原型上的方法,原型相關(guān)知識(shí)自行補(bǔ)充 ```javascript const obj = {} console.log(obj == 1); ``` 通過打印可知:調(diào)用 valueOf 方法返回值還是一個(gè)對(duì)象,所以,接下來(lái)會(huì)自動(dòng)使用 toString 轉(zhuǎn)換 ```javascript // {} console.log(obj.valueOf()); ``` 所以下面的結(jié)果為 true ```javascript const obj = {} // true console.log(obj.toString() === "[object Object]"); ``` #### 3. 正確答案 --- 只要明白 == 運(yùn)算符的比較規(guī)則,其實(shí)這道題就很簡(jiǎn)單。只需要自己實(shí)現(xiàn) valueOf 方法,覆蓋原型上的 valueOf 方法,使其依次返回 1,2,3 即可??赐曛?,是不是覺得挺簡(jiǎn)單的,心中會(huì)想:大廠面試題就這? ```javascript const obj = { n: 1, valueOf() { return this.n++ } } // true console.log(obj == 1 && obj == 2 && obj == 3); ```