經典面試題:讓 a == 1 && a == 2 && a == 3 成立
一、問題解析
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 天,點選檢視活動詳情”