《高效能javascript》學習筆記五
五、字串和正則表示式的優化
1、字串拼接方式的分析
常見的拼接方式如上(因成書較早,不含es6模板字串的方法。)
(1)+操作符與+=操作符
有一個例子:str+='one'+'two;
在執行時,瀏覽器會經理四個步驟:
<1>、在記憶體中建立一個臨時字串;
<2>、連線後的字串'onetwo'被賦值給該臨時字串;
<3>、臨時字串與str當前的值連線;
<4>、結果賦值給str
以下程式碼可省略第一步、第二步:
str+='one';
str+='two';'
用這一句可以達到一樣的效果:str=str+'one'+'two。
因為字串拼接時,從左向右依次連線,避免使用了臨時字串。
注意,str='one'+str+'two'將會失去優化效果。因為在字串的拼接時,如果基礎字串位於最左側,就可以避免重複拷貝一個逐漸變大的基礎字串(str可能很長)
(2)陣列的join()方法
看一下以下操作:
這種方式的問題在於在迴圈過程中,重複的計算並修改了每次迴圈的的newStr的值,可以用陣列的join方法提升效能。
(3)字串的concat方法。
這是concat的幾種用法,書寫非常的簡潔,但是,concat要比簡單的+和+=稍慢。在實際開發中,在程式碼可讀性和效能上應找到一個平衡點。
2、正則表示式優化
(1)正則表示式的工作原理
<1>、編譯
當你建立了一個正則表示式物件,瀏覽器會驗證然後轉換為一個原生程式碼程式。(注意,避免重複建立相同的正則表示式)
<2>、設定起始位置
正則表示式進入使用狀態,會從目標字串的指定起始位置開始匹配。預設是字串的起始位置,exec和test方法可以指定起始位置。
當由第四步:回溯返回到這一步時,起始位置是最後一次匹配的起始位置的下一個字元的位置(即上一次匹配的起始位置的下一個字元開始匹配)。
<3>、匹配正則表示式
正則表示式開始工作時,它會逐個檢查文字和正則表示式模式,當出現匹配失敗,會嘗試回溯到之前嘗試匹配的位置上,然後嘗試其他可能的路徑。
<4>、匹配成功或失敗
如果正則表示式發現了一個匹配,那麼會表示為匹配成功。如果所有可能的路徑都匹配失敗,正則表示式引擎會回溯到第二步,從下一個字元開始嘗試,直到最後一個字元,如果還沒有匹配成功,則正則表示式宣佈匹配失敗。
(2)回溯的分析