为什么在这种情况下使用`concat`而不是`push`?

时间:2018-01-24 17:09:05

标签: javascript arrays performance

我正在浏览此问题的答案:Can I dispatch an action in reducer?,在this answer中,我看到以下内容:

actionQueue = actionQueue.concat([asyncAction]);

基本上与:

相同
actionQueue.push(asyncAction);

(忽略concat调用正在创建一个新数组并将其重新分配给actionQueue,结果是相同的 - 附加了asyncAction的数组)。

最初,我认为它(或许)表现得更好(某种程度上),而其他人显然想知道他们在jsperf中打败了我:Array .concat() vs. .push()

正如jsperf测试结果所示,concat方法明显慢于push(至少就Chrome而言)。

我有什么遗失的吗? 在这个用例中,是否有concat首选的原因?

3 个答案:

答案 0 :(得分:6)

如果某些其他代码引用actionQueue中的现有数组,则使用concat不会影响该数组。



var a1 = [1];
var b1 = a1
a1 = a1.concat([2])

var a2 = [1];
var b2 = a2
a2.push(2)

console.log('b1', b1)
console.log('b2', b2)




答案 1 :(得分:2)

推()

push()方法是类似于call()apply()的通用方法。它将改变您的数组(或对象),将新值推入其中。

Push: MDN

的毗连()

concat()方法返回一个新数组,并合并值。这也避免了突变副作用。

Concat: MDN

答案 2 :(得分:0)

通过简单的推入操作将数组添加到相同的引用中,而concat不会影响原始数组。查看以下代码段

let x = [1,2,3,4];
let y = x.concat(5);
// At this step y hold [1,2,3,4,5] and x remain unchanged to [1,2,3,4]
document.write('x=>'+x);
document.write('y=>'+y);

let z = x.push(5);
// At this step z hold 5 and x is now changed to [1,2,3,4,5]
document.write('x=>'+x);
document.write('z=>'+z);