2011-09-04 40 views
50

哪种方法更快?数组加入vs字符串Concat

阵列加入:

var str_to_split = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"; 
var myarray = str_to_split.split(","); 

var output=myarray.join(""); 

字符串连接:

var str_to_split = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"; 
var myarray = str_to_split.split(","); 

var output = ""; 
for (var i = 0, len = myarray.length; i<len; i++){ 
    output += myarray[i]; 
} 
+0

取决于你想要的。 String方法稍微简单一些。 Array连接方式可能会更快一些(你可以在jsperf.com上测试)。 – andrewmu

+0

准确的for循环是什么?只是复制或者你在做处理。有更快的方法来复制数组。 – epascarello

+0

epascarello,他们只是愚蠢的例子来测试这两种方法 – ajax333221

回答

34

ECMAScript中的字符串串联速度更快。下面是我创建的告诉你一个风向标:

http://jsben.ch/#/OJ3vo

+0

Safari似乎是唯一的浏览器,他们的脖子和颈部。 – AlienWebguy

+0

拼接20个字母,它的基准仍然一致。 – AlienWebguy

+0

我也认为相反,但我发现了另一个例子http://jsperf.com/join-concat/2。这是为什么?在ECMAScript中不是String不可变的吗? –

8

我可以肯定地说,使用Array.join()更快。我已经编写了几段JavaScript代码,并通过删除字符串操作来支持数组,从而显着提高了性能。

+2

最新的测试支持:https://github.com/nodejs/node/issues/6610 –

2

根据this Google document titled 'Optimizing JavaScript code'字符串连接慢则数组加入,但显然这不是真正的现代JavaScript引擎。

我制作了a benchmark for the Fibonacci test example他们在文档中使用它表明串联(胶合)的字符串几乎是使用Arrayjoin快4倍。

+1

基准不是很好,因为您不仅比较字符串连接和连接一个数组,但在连接情况下,也会在基准测试中创建一个新数组。 – dpr

6

从2011年进入现代...

请参阅以下join重写使用字符串连接,以及如何慢得多,它比标准的执行情况。

// Number of times the standard `join` is faster, by Node.js versions: 
// 0.10.44: ~2.0 
// 0.11.16: ~4.6 
// 0.12.13: ~4.7 
// 4.4.4: ~4.66 
// 5.11.0: ~4.75 
// 6.1.0: Negative ~1.2 (something is wrong with 6.x at the moment) 
function join(sep) { 
    var res = ''; 
    if (this.length) { 
     res += this[0]; 
     for (var i = 1; i < this.length; i++) { 
      res += sep + this[i]; 
     } 
    } 
    return res; 
} 

道德是 - 不手动连接字符串,总是使用标准join

+2

我遇到了这个话题,其他答案也许在2011年是正确的,但是在这一刻,联合确实更好。 – Cageman

-1

蔓延运营商,连续用三个点(...)编写的,是ES6新,让您扩展的能力,或扩散,可迭代对象为多个元素。

const books = ["Don Quixote", "The Hobbit", "Alice in Wonderland", "Tale of Two Cities"]; 
 
console.log(...books);

打印:唐吉诃德霍比特爱丽丝两个城市的仙境故事

+1

这只适用于你的函数接受多个('... rest')参数。 'console.log'就是这样一个例子。但是,这并不总是回答OP的问题,因为您可能正在使用只接受1个字符串参数的函数,在这种情况下,扩展运算符会失败。 – chharvey

0

手册级联更快,对于固定长度的数字数组。

Here's a JSPerf test that tests these two operations

zxy.join('/') 

// versus 

zxy[0] + '/' + zxy[1] + '/' + zxy[2] 

// given the array 

zxy = [1, 2, 3] 

// resulting in the string '0/1/2' 

```

结果:使用Chrome 64.0.3282.186,Array.join较慢46%。