經典面試題:讓 a == 1 && a == 2 && a == 3 成立

語言: CN / TW / HK

一、問題解析

JavaScript if (a == 1 && a == 2 && a == 3) { console.log('Win') }

如何列印除Win?

看到題目的第一眼,我是矇蔽的.怎麼可能會有如此矛盾的情況發生呢?就相當於一個人怎麼可能即是小孩,又是成年人,還是老年人呢?

冷靜下來,發現一些端倪。

它沒說讓a同時等於1 2 3。

而且js是單執行緒執行的。 即使它們寫在了一行,那也是從左到右執行的. 所以它們從時空上面就不是同一時期的東西。

既然不是同一時期的東西,那麼一個人當然可以是可以成為小孩子,之後成為過成年人,然後變成老年人了。

回到題目,那麼我想要讓這個條件成立,就需要獲取一次a的同時,讓它自增1。

二、解決辦法

2.1 toString

第一種方法,利用判斷過程中的[隱式轉換]的toString方法。在我的另外一篇為什麼[] == ![]結果為true?中詳細闡述過。

```js const a = { _a: 0, toString: function() { return ++_a } }

```

執行一次,就給_a加1,然後返回.

因為toString是Object.prototype上面預設的方法,所以這個辦法相當於把正常的隱式轉換中toString 方法給攔截了。

涉及原型和原型鏈的知識點

問題是可以解決了,但是帶來了新的問題.如果題目把雙等變成三個等怎麼辦。這裡的toString 已經預設把物件轉化為字串了.使用toStirng的話,結果就不成立了.

2.2 defineProperties

使用物件的資料攔截法:

JavaScript Object.defineProperties(window, { _a: { value: 0, writable: true }, a: { get: function() { return ++_a } } })

涉及到物件的訪問器相關內容

不知道是否讓你想起ue中的watch或者computed的指令呢?

三、總結

是否會做這道面試題沒有任何意義。但是能夠了解到這個面試題包含的知識點就很有意思。

從隱式型別轉換到原型和原型鏈,最後到物件的訪問權屬性。如果要繼續延伸的話,Vue的雙向繫結的實現原理,class中static的實現等等。

這些就是為什麼說,要構建前端的知識體系,能夠從一個知識點延伸到相關的其他知識點。

“開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 7 天,點選檢視活動詳情