我正在浏览此问题的答案: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
首选的原因?
答案 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()
的通用方法。它将改变您的数组(或对象),将新值推入其中。
concat()
方法返回一个新数组,并合并值。这也避免了突变副作用。
答案 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);