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

pet*_*ete 5 javascript arrays performance

我正在浏览这个问题的答案:我可以在reducer中发送一个动作吗?这个答案中,我看到以下内容:

actionQueue = actionQueue.concat([asyncAction]);
Run Code Online (Sandbox Code Playgroud)

这基本上与:

actionQueue.push(asyncAction);
Run Code Online (Sandbox Code Playgroud)

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

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

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

有什么我想念的吗?在这个用例中
是否有理由concat是首选的?

Rex*_*Rex 8

推()

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

推送:MDN

连接()

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

连接:MDN


SLa*_*aks 7

如果某些其他代码具有对现有数组的引用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)
Run Code Online (Sandbox Code Playgroud)


AB'*_*AB' 5

在简单的推送中,将数组追加到同一引用中,而 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);
Run Code Online (Sandbox Code Playgroud)