处理数组时使用扩展语法 (...) 和 push.apply 的区别

新手上路,请多包涵

我有两个数组,

 const pets = ["dog", "cat", "hamster"]

const wishlist = ["bird", "snake"]

我想将 wishlist 附加到 pets ,这可以使用两种方法完成,

方法一:

 pets.push.apply(pets,wishlist)

结果是: [ 'dog', 'cat', 'hamster', 'bird', 'snake' ]

方法二:

 pets.push(...wishlist)

这也导致: [ 'dog', 'cat', 'hamster', 'bird', 'snake' ]

当我处理更大的数据时,这两种方法在性能方面是否存在差异?

原文由 Net Myth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 306
1 个回答

Function.prototype.apply 和扩展语法在应用于大型数组时都可能导致堆栈溢出:

 let xs = new Array(500000),
 ys = [], zs;

xs.fill("foo");

try {
  ys.push.apply(ys, xs);
} catch (e) {
  console.log("apply:", e.message)
}

try {
  ys.push(...xs);
} catch (e) {
  console.log("spread:", e.message)
}

zs = ys.concat(xs);
console.log("concat:", zs.length)

使用 Array.prototype.concat 代替。除了避免堆栈溢出 concat 还具有避免突变的优点。突变被认为是有害的,因为它们会导致微妙的副作用。

但这不是教条。如果您在函数范围内并执行突变以提高性能并减轻垃圾收集,您可以执行突变,只要它们在父范围内不可见即可。

原文由 user6445533 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏