concat(array)push(...array)

我一直在使用.push(...)方法连接两个数组,解包第二个数组,使用三点符号,并将其作为参数(array1.push(...array2))传递.但我只是注意到.concat(...)做了同样的事情,至少就我所知是这样.

我只想知道使用一个比使用另一个有什么好处,如果有的话,除了.concat(...)更习惯用之外.

推荐答案

在抛出错误之前,JavaScript引擎通常会对可以传递给方法的参数数量设置上限,例如,下面的代码在Chrome中抛出错误:

const arr = Array(150000).fill(0);
const arr2 = [];
arr2.push(...arr);

而当使用.concat()时,您将只将一个数组传递给该方法,因此您不会收到错误:

const arr = Array(150000).fill(0);
const arr2 = [];
const res = arr2.concat(arr);
// res is an array with 150000 `0`s

此外,使用.push()+...可以有效地对可迭代/数组执行两次迭代,一次是将其内容解包为.push()方法的参数,另一次是由.push()方法本身在内部完成的一次迭代,以迭代每个参数并将其附加到目标array.

另一个值得注意的区别是两个方法返回的内容不同,.concat()将返回一个新数组,不会修改目标,这在.map().reduce()等方法中很有用,在这些方法中,您需要在不改变原始数组的情况下生成新array.而.push()将返回更新后的数组的长度并修改目标,因此这是另一个需要考虑的差异.

Javascript相关问答推荐

Fastify错误:CORS策略已阻止从起源api-dev.example.com上的MLhttp请求

为什么在集内和集外会产生不同的promise 状态(使用Promise.race)?

在JavaScript中,是否有一种方法可以创建自定义thable,在等待某些代码后自动触发它?

JQuery. show()工作,但. hide()不工作

Exceljs:我们在file.xlsx(...)&#中发现了一个问题'"" 39人;

我们如何从一个行动中分派行动

在服务器上放置了Create Reaction App Build之后的空白页面

构造HTML表单以使用表单数据创建对象数组

无法检测卡片重叠状态的问题

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

不能将空字符串传递给cy.containes()

如何在Svelte中从一个codec函数中调用error()?

Rxjs流中生成IMMER不能在对象上操作

如何在DYGRAPS中更改鼠标事件和键盘输入

将对象推送到数组会导致复制

使用类型:assets资源 /资源&时,webpack的配置对象&无效

未捕获的运行时错误:调度程序为空

postman 预请求中的hmac/sha256内标识-从js示例转换

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?

输入数据覆盖JSON文件