简短的回答:使用array.join。
长答案:
首先,连接并不比使用 array.join() 快,它更慢。这是因为每次连接时都会破坏两个字符串并创建一个新字符串。
采取以下代码:
<script>
function concat(){
var txt = '';
for (var i = 0; i < 1000000; i++){
txt =+ i + ',';
}
}
function arr(ar){
var txt = 'asdf' + ar;
}
ar = [];
for (var i = 0; i < 1000000; i++) {
ar.push(i);
}
concat();
arr(ar);
alert('done!');
</script>
并将其粘贴到 html 文件中。然后对其进行剖析。在我的机器(核心 i7EE、16GB RAM、SSD 磁盘、IE9)上,arr() 需要 0 毫秒,而 concat() 需要 12 毫秒。请记住,这是超过一百万次迭代(同样的测试在 IE6 上会有很大不同, concat() 需要几秒钟)。
其次,当只有两个值时,连接将与 array.join 相同。因此,对于您的示例,从性能的角度来看,它们都是等效的。如果您使用上面的代码并将 1000000 更改为 4,则 concat 和 arr 都需要 0ms 才能执行。这意味着您的特定流程的差异要么不存在,要么可以忽略不计,它不会显示在配置文件中。
第三,现代浏览器无论如何都使用 array.join() 优化字符串连接,所以从性能的角度来看,讨论可能没有实际意义。
这给我们留下了风格。就个人而言,我不会使用第一种形式,因为我不喜欢手动连接字符串(当你有 2 个 var 时,它相当简单,但如果你有 10 个 var 怎么办?那会产生很长的代码行。如果你收到一个包含 n 个值的数组,会出现一个 for 循环)。我也不会使用第二种形式,因为正如在另一个答案中指出的那样,该值被强制转换为字符串,这意味着正在进行一些隐式转换。这里的问题是隐含的部分。我知道现在数组在强制时用逗号连接,但是如果规范发生变化,或者某些天才决定在您的代码库中更改 Array.prototype 的 toString 实现会发生什么?只是为了好玩在 jsfiddle 中运行它:
Array.prototype.toString = function() {
return 'not the expected result!';
}
alert([1, 2]);
你能猜到答案会是什么吗?(上面的代码将对数组执行与您的代码相同类型的转换。通过 toString() 方法强制)
如果你使用 array.join(','); 您将通过说明 1) 无论 toString 实现如何,都将连接您的数组,以及 2) 它将用逗号连接,从而对您的代码进行未来验证。