首頁 > web前端 > js教程 > 主體

面試題目:怎麼讓「a==1&&a==2&&a==3」成立?

青灯夜游
發布: 2023-03-13 20:06:48
轉載
1449 人瀏覽過

這篇文章跟大家分享一個經典面試題,看看怎麼讓「a==1&&a==2&&a==3」成立?透過這個面試題,了解包含的知識點,希望對大家有幫助!

面試題目:怎麼讓「a==1&&a==2&&a==3」成立?

一、問題解析

if (a == 1 && a == 2 && a == 3) {
  console.log('Win')
}
登入後複製

如何讓if裡面的程式碼執行,成功在控制台列印出Win ?

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

面試題目:怎麼讓「a==1&&a==2&&a==3」成立?

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

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

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

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

面試題目:怎麼讓「a==1&&a==2&&a==3」成立?

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

二、解決方法

2.1 toString

第一種方法,利用判斷過程中的[隱含轉換]的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的話,結果就不成立了.

2.2 defineProperties

使用物件的資料攔截法:

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中文網其他相關文章!

相關標籤:
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡[email protected]
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!