【发布时间】:2014-10-09 23:30:03
【问题描述】:
在 jsperf 上有这个测试: http://jsperf.com/javascript-array-concat-vs-push
这表明 concat 更快,但如果你在初始数组中得到该结果,而不使用第三个变量,concat 会慢得多:
for (i = 10000; i > 0; i--) {
arr1 = arr1.concat(arr2);
}
即使你使用本地变量,但名称相同,结果也是一样的:
for (i = 10000; i > 0; i--) {
var arr1 = arr1.concat(arr2);
}
谁能解释一下?
【问题讨论】:
-
不确定我是否明白这个问题,
concat和push做不同的事情,一个连接两个数组,另一个推送到一个数组,但如果你对apply使用一些技巧,你可以使用一行代码而不是迭代将所有值从一个数组推送到另一个数组,但当然原生方法通常更快。 -
首先,您正在显着更改初始性能测试的条件:每次迭代时附加的数组都更大。除此之外,如果您不使用第三个变量,则会在每次迭代时创建和销毁一个辅助变量,这将解释额外的性能下降。
-
你的两个例子是等价的。 Javascript 变量具有函数作用域,而不是块作用域,因此变量声明被吊出循环。
-
@adeneo 如果您查看他链接到的 jsperf,它确实使用了“
apply的诡计” -
在我看来,jsperf 是在比较苹果和橙子。
concat测试将结果放入一个新变量中,因此它只是多次连接相同的两个数组。push测试正在修改原始数组之一,因此它在测试的每次迭代中不断增长。您的concat测试类似于基准测试中的push测试,因为您将结果保存在arr1中。这就是性能类似于push基准的原因。