這篇文章跟大家分享一個經典面試題,看看怎麼讓「a==1&&a==2&&a==3」成立?透過這個面試題,了解包含的知識點,希望對大家有幫助!
if (a == 1 && a == 2 && a == 3) { console.log('Win') }
如何讓if裡面的程式碼執行,成功在控制台列印出Win
?
看到題目的第一眼,我是蒙蔽的.怎麼可能會有如此矛盾的情況發生呢?就相當於一個人怎麼可能即是小孩,又是成年人,還是老年人呢?
冷靜下來,發現一些端倪。
它沒說讓a同時等於1 2 3。
而且js是單執行緒運行的。即使它們寫在了一行,那也是從左到右執行的. 所以它們從時空上面就不是同一時期的東西。
既然不是同一時期的東西,那麼一個人當然可以是可以成為小孩子,之後成為過成年人,然後變成老年人了。
回到題目,那麼我想要讓這個條件成立,就需要獲取一次a的同時,讓它自增1。
第一種方法,利用判斷過程中的[隱含轉換]的toString
方法。在我的另外一篇為什麼[] == ![]結果為true?#中詳細闡述過。
const a = { _a: 0, toString: function() { return ++a._a } }
執行一次,就給_a加1,然後回傳.
因為toString是Object.prototype
上面預設的方法,所以這個辦法相當於把正常的隱式轉換中toString
方法給攔截了。
涉及原型和原型鏈的知識點
問題是可以解決了。
評論區的有掘友說讓 a = true 也可以解決的。確實很有誤導性。其實是混淆了隱式轉換的優先順序。簡單來說,隱式轉換是由兩個部分組成:轉換的規則 觸發轉換的條件。 if
包裹著的裡面整體觸發了Boolean()
的轉換規則,==
又字串在右邊觸發toString()
的轉化規則。
回到這題,==
的右邊是數字,JS運行線路是從左到右的。所以,這個時候觸發的是Number()
的規則,把左邊的true
轉換成1
之後,兩邊型別一致之後,那自然不會再觸發什麼規則了,此時已經不構成隱式轉換。所以說1 == 1 && 1 == 2 && 1 == 3
是不成立的。
現在記住了,也比面試過程中的時候再來記好
#現在將題目簡單修改一下,雙等變成三個等怎麼辦?
大家都知道===
的話是先判斷類型,再判斷值。這裡的toString
已經預設把物件轉換成字串了.使用toStirng
的話,結果就不成立了.
使用物件的資料攔截法:
Object.defineProperties(window, { _a: { value: 0, writable: true }, a: { get: function() { return ++_a } } })
涉及到物件的存取器相關內容
不知道是否讓你想起Vue中的watch或computed的指令呢?
是否會做這道面試題沒有任何意義。但是能夠了解到這個面試題目所包含的知識點就很有意思。
從隱式型別轉換到原型和原型鏈,最後到物件的存取權屬性。如果要繼續延伸的話,Vue的雙向綁定的實作原理,class中static的實作等等。
這些就是為什麼說,要建構前端的知識體系,能夠從一個知識點延伸到相關的其他知識點。
【推薦學習:javascript高階教學】
#以上是面試題目:怎麼讓「a==1&&a==2&&a==3」成立?的詳細內容。更多資訊請關注PHP中文網其他相關文章!