前段時間在 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 了。
以爲內容有幫助能夠關注下個人公衆號 「前端真好玩」咯,按期分享如下主題內容: