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