gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:21:56 30 4
gpt4 key购买 nike

我有两个数组,

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

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

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

方法一:

pets.push.apply(pets,wishlist)

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

方法2:

pets.push(...wishlist)

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

当我处理较大的数据时,这两种方法在性能方面有区别吗?

最佳答案

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

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

关于javascript - 处理数组时使用扩展语法 (...) 和 push.apply 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39716216/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com