最經常使用的鏈接字符串的方法應該是下面幾種:javascript
// 1.=操做符
str = 'a' + 'b' + 'c';
// 2. +=操做符
str = 'a';
str += 'b';
str += 'c';
// 3. Array.join()
str = ['a', 'b', 'c'].join('');
// 4. String.concat()
str = 'a';
str = str.concat('b', 'c');
複製代碼
那麼來看一下這幾種有什麼區別,或者會形成什麼影響。java
運行str += 'one' + 'two'
會經歷如下4個過程:數組
onetwo
被賦值給該臨時字符串;str
當前的值鏈接;str
。拼接這個短短的字符串就會經歷以上4個步驟,那麼能夠進行優化嗎?請看下面的代碼:瀏覽器
// 1
str += 'one';
str += 'two';
// 2
str = str + 'one' + 'two';
複製代碼
以上兩種方式雖然能達到一樣的效果,可是卻能夠避免產生臨時字符串(也就是4個步驟中的1&2步驟);在大多數瀏覽器中這樣作會提速10%~40%(IE7以上,IE8效果不明顯,實現機制與此不一樣)。性能
可是若是將上面的代碼2換成:str = 'one' + str + 'two'
,則優化將失效。這與瀏覽器合併字符串時分配內存的方法有關:優化
除IE外,其餘瀏覽器會嘗試爲表達式左側的字符串分配更多的內存,而後簡單地將第二個字符串拷貝至它的末尾。若是在一個循環中,基礎字符串位於最左端的位置,就能夠避免重複拷貝一個逐漸變大的基礎字符串。spa
基本字符串能夠理解爲鏈接時排在前面的字符串。也就是說:
str + 'one'
意味着拷貝one
並附加在str
以後,而'one' + str
則意味着要拷貝str
並附加在'one'
以後,若是str
很大,拷貝過程的性能損耗(內存佔用)就會很高。prototype
說回IE8的實現機制:code
在IE8的實現中,鏈接字符串只是記錄現有的字符串的引用來構造新的字符串。在最後時刻(當你真正要使用鏈接後的字符串時),字符串的各個部分纔會逐個拷貝到一個新的「真正的」字符串中,而後用它取代先前的字符串引用,因此並不是每次使用字符串時都發生合併操做。ip
而IE7的實現機制更糟糕:
每鏈接一對字符串都要把它複製到一塊新分配的內存中。
大多數瀏覽器中,數組項合併比其餘字符串鏈接方法更慢
Array.join()
當把全部的數組的元素鏈接在一塊兒時,瀏覽器會分配足夠的內存來存放整個字符串,並且不會屢次拷貝最終字符串中相同的部分。
字符串的原生方法concat()
能接收任意數量的參數,並將每個參數附加到所調用的字符串上。可是多數狀況下,使用concat()
比使用簡單的+
和+=
稍慢,尤爲在IE,Opera和Chrome中慢得更明顯。
在《高性能JavaScript》看到了就記錄一下,方便之後查看。