('b' + 'a' + + 'a' + 'a').toLowerCase()輸出什麼?

今天在微信前端羣裏看到一個有意思的面試題:前端

('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。
複製代碼

注意看上面的這段話:若是操做數不是一個數值,會嘗試將其轉換成一個數值和若是它不能解析一個值,則計算結果爲 NaN

那上面代碼的+ 'a'就是會變成NaN,過程以下:文檔

'b' + 'a' + NaN + 'a'
// to
'b' + 'a' + "NaN" + 'a'
複製代碼

最終在調用toLowerCase函數轉成小寫,就變成了banana字符串

有時候代碼就是這麼神奇🤖,今天週一,搬磚啦~🤡

相關文章
相關標籤/搜索