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