('b'+'a'+ + 'a'+'a').toLowerCase() === 'banana'?

前段時間在 Twitter 上看到一個問題前端

其實這是一道基礎題目,考察點是類型轉換以及操做符優先級。函數

首先這道題目中的加號並不全是用於加法的,++'a' 中的第二個加號實際上是一元操做符。學習

一元加號操做符的優先級實際上是比加法運算符高的spa

所以這道題目應該先當作:code

'b' + 'a' + (+'a') + 'a'
複製代碼

那麼接下來咱們來學習一下一元加號操做符的做用。其實在 JS 中總共有九種一元操做符,分別爲:cdn

  • +
  • -
  • !
  • ++
  • --
  • ~
  • typeof
  • delete
  • void

固然本文主題不是介紹全部一元操做符做用的,所以咱們就簡單來了解一下 + 的做用便可。對象

這個操做符的做用是嘗試把任何東西都轉成 number,若是轉換失敗的話就會返回 NaN,如下是一些轉換的例子:blog

// 1
+1
// 1
+'1'
// 1
+true
// 0
+null
// 另外還有個騷操做,若是一個對象有 valueOf 的話
// 那麼轉換的是該函數的返回值
+{
  valueOf: () => 1
}
複製代碼

所以對於 +'a' 來講,返回值應該是 NaN字符串

如今的題目就轉換成了這樣:string

'b' + 'a' + (NaN) + 'a'
複製代碼

雖然 NaN 表明這個值不是數字,可是它的類型仍是 number。加法操做符在數字和字符串相加的過程當中會將數字轉換爲字符串,所以如今的題目就轉換成了這樣:

'b' + 'a' + 'NaN' + 'a'
複製代碼

因此結果就是 baNaNa,經過調用 toLowerCase() 就變成了 banana

最後

雖然題目看着簡單,可是考察的內容仍是多方面的,固然最想說的仍是 fuckJS 了。

以爲內容有幫助能夠關注下個人公衆號 「前端真好玩」咯,按期分享如下主題內容:

  • 前端小知識、冷知識
  • 原理內容
  • 提高工做效率
  • 我的成長

相關文章
相關標籤/搜索