今天在微信前端羣裏看到一個有意思的面試題:前端
('b' + 'a' + + 'a' + 'a').toLowerCase() 結果是什麼?
複製代碼
好吧,才疏學淺的我看到這題的答案是:面試
baaa
複製代碼
banana
複製代碼
既然這麼說了,那這必定是錯誤答案了,下面咱們來解析一下這個題:微信
1. js運算優先級和隱士轉換函數
仔細一想,這題估計和JavaScript運算符優先級、隱式轉化有關係。
因而先去MDN查了一下JavaScript運算符優先級
我先把上面代碼用到的運算符和優先級列舉出來:spa
優先級 | 運算類型 | 關聯性 | 運算符 |
---|---|---|---|
20 | 圓括號 | n/a | (...) |
16 | 一元正號 | 從右至左 | + ... |
13 | 加法 | 從左至右 | ... + ... |
好了,如今咱們來解析一下這個代碼:code
'b' + 'a' + (+ 'a') + 'a'
一元正號的優先級高於加法,因此咱們這樣用括號會讓這個代碼更加清晰<br>
先運算優先級高的,也就是括號裏面的,在與運算括號外面的
複製代碼
2. 一元正號 運算對象
這時候就涉及到第二個重要的知識點,一元正號的運算,先來看官方文檔:ip
一元正號運算符位於其操做數前面,計算其操做數的數值,若是操做數不是一個數值,會嘗試將其轉換成一個數值。
儘管一元負號也能轉換非數值類型,可是一元正號是轉換其餘對象到數值的最快方法,也是最推薦的作法,由於它不會對數值執行任何多餘操做。
它能夠將字符串轉換成整數和浮點數形式,也能夠轉換非字符串值true,false和null。小數和十六進制格式字符串也能夠轉換成數值。
負數形式字符串也能夠轉換成數值(對於十六進制不適用)。若是它不能解析一個值,則計算結果爲 NaN。
複製代碼
那上面代碼的+ 'a'就是會變成NaN,過程以下:文檔
'b' + 'a' + NaN + 'a'
// to
'b' + 'a' + "NaN" + 'a'
複製代碼
最終在調用toLowerCase函數轉成小寫,就變成了banana字符串
有時候代碼就是這麼神奇🤖,今天週一,搬磚啦~🤡