2016-11-21 16 views
2

我想知道是否有在下面的語句之間的性能的任何差異來concatinate兩個字符串str1='a'str2='b'有的concat()之間的差,「=」和「+ =」

str1 = str1 + str2; 

str1 += str2; 

var res = str1.concat(str2); 

我曾嘗試以下給我確保性能,但對於相同的聲明,輸出似乎在執行過程中會發生很大變化。

var str1='a', str2='b'; 
var old_time=new Date(); 
for (var i=0; i<=1000000 ; i++){  
    str1=str1+str2;  // change this one with the other statements 
} 
var new_time=new Date(); 
console.log(new_time - old_time); 
+4

您是否創建了[jsperf](https://jsperf.com/)? –

+0

不,我不知道這個工具的存在 – achref

+2

[JavaScript中的+運算符和concat()方法有什麼區別](http://stackoverflow.com/questions/34465804/what-is-運算符和concat-method-in-javascript) – Wondercricket

回答

0

根據MDN「強烈建議賦值運算符(+,+ =)用於代替concat()方法見本performance test。」

+0

爲什麼downvote? –

+1

我還沒有投票,但這是[一個鏈接的答案](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-答案)。 – ssube

+0

國際海事組織沒有太多需要說的,鏈接來自明確的來源,明確回答這個問題:(*我想知道下面的陳述*之間是否有任何性能差異)。 –

-1

的這些差異3個連接方法是concat方法需要在String.prototype處得到/查找(我猜String是本地引用的,沒有在全局對象上得到/查找),所以,「更慢」。

我不清楚+== ... + ...,但+=應該比= ... + ...快,因爲它是原生的。

+1

不知道「應該」,「+」和「+ =」都是內置運算符。至少在舊版本的IE中,使用'+ ='連接字符串比賦值'+'慢很多,所以我期望它是依賴於實現的。 – RobG

+0

@RobG奇怪!我所知道的更快,有時候會更慢。這個'String#concat'在註釋的性能測試中,速度較慢,而且沒有意義。 '+ ='應該比'='快,因爲你不需要指定串聯的舊值(這可以被本地處理)。 – Hydro

0

str1 += str2; 

似乎是一點點快於str1 = str1 + str2;但由於字符串是不可變的,你不能從str1重新使用舊的參考。例如:

str0 = str1; // duplicate reference 
str1 += str2; 

str0慾望保留其舊值(與str2連接前),使級聯後,str1是一個新的對象(不像可變對象,其中就地串聯可以更快,因爲我們預計s0也會改變)

我仍然更喜歡+=語法,因爲它更簡潔,更易於理解。

+0

虛擬機可以輕鬆合法地將'x = x + y'優化爲'x + = y',特別是對於像大多數字符串這樣的基元。由於字符串是不可變的(通常是在寫入時拷貝並可能使用某種形式的繩索),所以關於臨時對象的位也是誤導性的,並且通常會創建副本(或者根據虛擬機可能永遠不會創建副本)。 – ssube

+0

@ssube我認爲這已經過去了,並且大量地編輯了我的答案,因爲我意識到它在JavaScript上下文中的高度不正確。 –