正如得到最高票的回答所说,a.push(...b)
可能是正确的答案,考虑到大小限制问题。
另一方面,一些关于性能的回答似乎过时了。
以下数字为2022-05-20:
来自这里
看起来在 2022 年, push
在整体上都是最快的。但这可能会在未来发生改变。
忽略问题(生成新数组)的回答是没什么意义的。许多代码可能需要 / 想要就地修改数组,因为可能会有对同一数组的其他引用。
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);
cart.push(...newItems);
}
顺带一提,建议修改
Array.prototype
的答案可能是错误的建议。更改本机原型基本上就像在代码中设置地雷一样。另一种实现可能与您的实现不同,因此它将破坏您的代码或者您会因期望其它行为而破坏其它代码。这包括当本机实现添加与您的实现冲突时。您可能会说“我知道我在使用什么,所以没有问题”,这在目前可能是真的,您只是单个开发人员,但是增加第二个开发人员后,他们无法读取您的思想。并且,当您忘记并在页面上嵌入其他库(分析?日志记录?…)并忘记留在代码中的地雷时,几年后您就成了那个第二个开发人员。
这不仅仅是理论。有无数的网络故事讲述了人们遇到这些地雷的经历。
可以说,修改本机对象的原型只有很少几种安全用途。其中之一是在旧浏览器中填充现有和指定的实现。在这种情况下,规范被定义,实现在新浏览器中正在运行,您只需在旧浏览器中获得相同的行为即可。那非常安全。在规范尚未发布但尚未运行时进行预修补理论上不安全,因为规范可能会在发布前更改。