JS数组 concat() 与扩展运算符的深度解析与最佳实践

文章目录

    • 前言
    • 一、语法对比
      • 1. `Array.prototype.concat()`
      • 2. 扩展运算符(解构赋值)
    • 二、性能差异(大规模数组)
      • 关键差异原因
    • 三、适用场景建议
    • 总结

前言

最近工作中遇到了一个大规模数组合并相关的问题,在数据合并时有些耗时严重,这里记录一下,这里探究一下concat()和扩展运算符的差异。

一、语法对比

1. Array.prototype.concat()

直接创建一个新数组,按顺序复制所有元素。内存分配是单次连续操作,引擎可一次性预分配内存。

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const merged = arr1.concat(arr2); // [1, 2, 3, 4, 5, 6]

2. 扩展运算符(解构赋值)

需要多次动态扩容:初始为空数组,逐步添加元素时可能触发多次内存重分配(类似 push())。

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const merged = [...arr1, ...arr2]; // [1, 2, 3, 4, 5, 6]
// 扩展运算符执行类似于以下:
// const merged = [];
// for (const item of arr1) merged.push(item);
// for (const item of arr2) merged.push(item);

二、性能差异(大规模数组)

指标concat()解构赋值 [...arr]
时间复杂度O(n)(单次连续复制)O(n)(但含多次扩容开销)
实际速度更快(引擎高度优化)较慢(尤其数组极大时)
内存峰值较低(预分配连续内存)较高(扩容时旧新数组同时存在)
10 万元素耗时示例~5ms~15ms(慢 2-3 倍)
100 万元素耗时示例~50ms~200ms(慢 4 倍以上)

关键差异原因

  • 扩容成本
    解构赋值的动态 push() 行为在数组极大时可能触发多次内存扩容(如容量 2→4→8→16…),每次扩容需复制旧数据到新内存区域。

  • 引擎优化
    concat() 被 JavaScript 引擎(如 V8)深度优化,可直接操作内存块,避免中间步骤。

  • 临时迭代器
    解构赋值需要为每个数组创建迭代器对象,增加额外开销。

三、适用场景建议

场景推荐方法原因
数组合并(> 10,000 元素)concat()性能优势显著,内存占用低
小型数组(< 1000 元素)解构赋值代码简洁,差异可忽略
需动态插入元素解构赋值方便添加额外元素([...a, x, ...b]
内存敏感环境(如低端设备)concat()避免多次扩容导致的内存峰值

总结

  • 大型数组(> 10k 元素):优先用 concat()(不修改原数组)或 push(…arr)(可修改原数组)。

  • 解构赋值 […arr1, …arr2]:仅推荐小型数组或需要代码简洁的场景。

  • 性能排序(大数组合并):
    push(…arr) > concat() > […arr1, …arr2]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一套qt c++的串口通信

实现了创建线程使用串口的功能 具备功能: 1.线程使用串口 2.定时发送队列内容&#xff0c;防止粘包 3.没处理接收粘包&#xff0c;根据你的需求来&#xff0c;handleReadyRead函数中&#xff0c;可以通过m_receiveBuffer来缓存接收&#xff0c;然后拆分数据来处理 源码 seri…

设计模式-发布订阅

文章目录 发布订阅概念发布订阅 vs 监听者例子代码 发布订阅概念 发布/订阅者模式最大的特点就是实现了松耦合&#xff0c;也就是说你可以让发布者发布消息、订阅者接受消息&#xff0c;而不是寻找一种方式把两个分离 的系统连接在一起。当然这种松耦合也是发布/订阅者模式最大…

windows-cmd 如何查询cpu、内存、磁盘的使用情况

在 Windows 中&#xff0c;您可以使用命令提示符&#xff08;CMD&#xff09;通过一些命令来查询 CPU、内存和磁盘的使用情况。以下是常用的命令和方法&#xff1a; 1. 查询 CPU 使用情况 使用 wmic 命令 wmic cpu get loadpercentage 这个命令会显示当前 CPU 的使用百分比…

allWebPlugin中间件VLC专用版之截图功能介绍

背景 VLC控件原有接口具有视频截图方法&#xff0c;即video对象的takeSnapshot方法&#xff0c;但是该方法返回的是一个IPicture对象&#xff0c;不适合在谷歌等现代浏览器上使用。因此&#xff0c;本人增加一个新的视频截图方法takeSnapshot2B64方法&#xff0c;直接将视频截图…

第Y5周:yolo.py文件解读

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本次任务&#xff1a;将YOLOv5s网络模型中的C3模块按照下图方式修改形成C2模块&#xff0c;并将C2模块插入第2层与第3层之间&#xff0c;且跑通YOLOv5s。 任务…

宝塔安装ssh证书报错:/usr/bin/curl: symbol lookup error: curl_easy_header

原因&#xff1a; 你当前的 curl 命令版本是 7.70.0&#xff08;不是系统默认版本&#xff0c;应该是你手动安装的&#xff09;。它链接的是 /usr/local/lib/libcurl.so.4&#xff0c;而不是 CentOS 系统默认的 /usr/lib64/libcurl.so.4。/usr/local/lib/libcurl.so.4 很可能是…

Apache SeaTunnel 引擎深度解析:原理、技术与高效实践

Apache SeaTunnel 作为新一代高性能分布式数据集成平台&#xff0c;其核心引擎设计融合了现代大数据处理架构的精髓。 Apache SeaTunnel引擎通过分布式架构革新、精细化资源控制及企业级可靠性设计&#xff0c;显著提升了数据集成管道的执行效率与运维体验。其模块化设计允许用…

测试用例及黑盒测试方法

一、测试用例 1.1 基本要素 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等4个主要要素。 1.1.1 测试环境 定义&#xff1a;测试执行所需的软硬件…

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

目录 1 运算放大电路基础 1.1 概述 1.1.1 基本结构 1.1.2 理想特性 1.2 运算放大分析方法 1.2.1 虚短 1.2.2虚断 1.2.3 叠加定理 2 同向比例运算放大电路 2.1 概述 2.1.1 基本电路结构 2.1.2 电路原理 2.2 仿真分析 2.2.1 电压增益 2.2.2 相位分析 3 反向比例运…

板凳-------Mysql cookbook学习 (九)

第4章&#xff1a;表管理 4.0 引言 MySQL &#xff1a;&#xff1a; 员工样例数据库 &#xff1a;&#xff1a; 3 安装 https://dev.mysql.com/doc/employee/en/employees-installation.html Employees 数据库与几种不同的 存储引擎&#xff0c;默认情况下启用 InnoDB 引擎。编…

MySQL省市区数据表

数据结构简单展示一下 具体的可以点击文章最后的链接地址下载 连接地址中有两个文件一个是详细的另一个是简洁的 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for ln_new_region -- ---------------------------- DROP…

无人机报警器探测模块技术解析!

一、运行方式 1. 频谱监测与信号识别 全频段扫描&#xff1a;模块实时扫描900MHz、1.5GHz、2.4GHz、5.8GHz等无人机常用频段&#xff0c;覆盖遥控、图传及GPS导航信号。 多路分集技术&#xff1a;采用多传感器阵列&#xff0c;通过信号加权合并提升信噪比&#xff0c;…

Oracle 导入导出 dmp 数据文件实战

一、DMP文件基础知识​​ 1. ​​DMP文件定义​​ DMP&#xff08;Data Pump Dump File&#xff09;是Oracle数据库专用的二进制格式文件&#xff0c;由expdp/impdp或旧版exp/imp工具生成。它包含数据库对象的元数据&#xff08;表结构、索引等&#xff09;和实际数据&#x…

Coursier:安装sbt

命令 ./cs launch sbt -- --version 的含义是​​通过 Coursier&#xff08;cs&#xff09;工具启动 SBT&#xff08;Scala 构建工具&#xff09;&#xff0c;并查询其版本信息​​。具体解析如下&#xff1a; ​​1. 命令结构解析​​ ​​./cs​​&#xff1a; 这是 Coursie…

【深度学习】12. VIT与GPT 模型与语言生成:从 GPT-1 到 GPT4

VIT与GPT 模型与语言生成&#xff1a;从 GPT-1 到 GPT4 本教程将介绍 GPT 系列模型的发展历程、结构原理、训练方式以及人类反馈强化学习&#xff08;RLHF&#xff09;对生成对齐的改进。内容涵盖 GPT-1、GPT-2、GPT-3、GPT-3.5&#xff08;InstructGPT&#xff09;、ChatGPT …

项目更改权限后都被git标记为改变,怎么去除

❗问题描述&#xff1a; 当你修改了项目中的文件权限&#xff08;如使用 chmod 改了可执行权限&#xff09;&#xff0c;Git 会把这些文件标记为“已更改”&#xff0c;即使内容并没有发生任何改变。 ✅ 解决方法&#xff1a; ✅ 方法一&#xff1a;告诉 Git 忽略权限变化&am…

openfeignFeign 客户端禁用 SSL

要针对特定的 Feign 客户端禁用 SSL 验证&#xff0c;可以通过自定义配置类实现。以下是完整解决方案&#xff1a; 1. 创建自定义配置类&#xff08;禁用 SSL 验证&#xff09; import feign.Client; import feign.httpclient.ApacheHttpClient; import org.apache.http.conn…

移动端 UI自动化测试学习之Appium框架(包含adb调试工具介绍)

文章目录 前言adb调试工具adb组成常用命令获取程序的包名和界面名文件传输发送文件到手机从手机中拉取文件 获取app启动时间获取手机日志其他命令 Appium 简介工作原理图 环境搭建安装客户端库&#xff08;appium lib&#xff09;安装Appium Server安装JDK&#xff08;自行下载…

【论文解读】DETR: 用Transformer实现真正的End2End目标检测

1st authors: About me - Nicolas Carion‪Francisco Massa‬ - ‪Google Scholar‬ paper: [2005.12872] End-to-End Object Detection with Transformers ECCV 2020 code: facebookresearch/detr: End-to-End Object Detection with Transformers 1. 背景 目标检测&#…

性能测试-jmeter实战1

课程&#xff1a;B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 性能测试-jmeter实战1 为什么需要性能测试呢&#xff1f;性能测试的作用&#xff1f;性能测试体系性能测试基础性能测试工具性能监控…