编程语言
首页 > 编程语言> > javascript – 处理数组时使用扩展语法(…)和push.apply之间的区别

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

作者:互联网

我有两个数组,

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

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

我想把愿望清单附加到宠物身上,可以用两种方法来完成,

方法1:

pets.push.apply(pets,wishlist)

结果是:[‘狗’,’猫’,’仓鼠’,’鸟’,’蛇’]

方法2:

pets.push(...wishlist)

这也导致:[‘狗’,’猫’,’仓鼠’,’鸟’,’蛇’]

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

解决方法:

当应用于大型数组时,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还具有避免突变的优点.突变被认为是有害的,因为它们可能导致微妙的副作用.

但这不是教条.如果您正在使用函数作用域并执行突变以提高性能并减少垃圾回收,则可以执行突变,只要它们在父作用域中不可见即可.

标签:spread-syntax,javascript,arrays,ecmascript-6,apply
来源: https://codeday.me/bug/20191005/1855239.html