正如投票最多的答案所说,考虑到大小限制问题,a.push(...b) 可能是正确的答案。
另一方面,一些关于性能的答案似乎已经过时了。
以下这些数字适用于 2022-05-20
来自here
push 似乎是 2022 年全线最快的。这在未来可能会改变。
忽略问题(生成新数组)的答案没有抓住要点。鉴于可能存在对同一数组的其他引用,许多代码可能需要/想要就地修改数组
let a = [1, 2, 3];
let b = [4, 5, 6];
let c = a;
a = a.concat(b); // a and c are no longer referencing the same array
那些其他引用可能在某个对象的深处,在闭包中捕获的东西,等等......
作为一个可能糟糕的设计但作为一个例子,想象一下你有
const carts = [
{ userId: 123, cart: [item1, item2], },
{ userId: 456, cart: [item1, item2, item3], },
];
和一个功能
function getCartForUser(userId) {
return customers.find(c => c.userId === userId);
}
然后您想将商品添加到购物车
const cart = getCartForUser(userId);
if (cart) {
cart.concat(newItems); // FAIL ?
cart.push(...newItems); // Success! ?
}
顺便说一句,建议修改Array.prototype 的答案可以说是糟糕的建议。更改本机原型基本上是代码中的地雷。另一个实现可能与您的不同,因此它会破坏您的代码,或者您会破坏他们期望其他行为的代码。这包括是否/何时添加与您的冲突的本机实现。你可能会说“我知道我在用什么,所以没问题”,目前这可能是真的,你是一个开发人员,但添加第二个开发人员,他们无法读懂你的想法。而且,您是几年内的第二个开发人员,当时您忘记了然后将其他一些库(分析?、日志记录?,...)移植到您的页面上,而忘记了您在代码中留下的思想。
这不仅仅是理论。网上关于人们撞上这些地雷的故事数不胜数。
可以说,修改本机对象的原型只有一些安全用途。一种是在旧浏览器中填充现有的和指定的实现。在这种情况下,规范已定义,规范已在新浏览器中实现,您只想在旧浏览器中获得相同的行为。那很安全。预修补(规范正在进行中但尚未发布)可以说是不安全的。规格在发货前更改。