【问题标题】:Why use `concat` instead of `push` in this instance?为什么在这种情况下使用 `concat` 而不是 `push`?
【发布时间】:2018-07-03 19:50:32
【问题描述】:

我正在浏览这个问题的答案: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

【问题讨论】:

  • 我相信这一切都与immutability有关

标签: javascript arrays performance


【解决方案1】:

如果其他代码引用了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)

【讨论】:

  • 即使concat 创建的新数组被重新分配给同一个变量?
  • @pete:这只是一个变量。它不会影响对数组的其他引用。
  • 我在答案中添加了一个代码示例,以帮助使其更清晰。希望@SLaks 不介意我这样做:)
【解决方案2】:

推送()

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

Push: MDN

连接()

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

Concat: MDN

【讨论】:

    【解决方案3】:

    在简单的 push 中,将数组追加到相同的引用中,而 concat 不会影响原始数组。看看下面的sn-p

    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);

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2019-12-25
      • 2017-06-11
      • 2017-01-07
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      相关资源
      最近更新 更多