JavaScript 数组合并性能优化:扩展运算符 vs concat vs 循环 push

在日常开发中,我们经常需要合并数组,比如批量导入数据、分页加载列表、处理大量日志等场景。当数组规模较小时,用什么方法都差不多;但当数组达到成千上万条时,选择不当的方法可能会导致栈溢出内存飙升

今天我们就来聊聊 JavaScript 中三种常见的数组合并方式,看看它们各自的优缺点,以及在不同场景下应该如何选择。

三种数组合并方式

1. 扩展运算符 + push:arr.push(...otherArr)

这是最"爽"的写法,一行代码搞定:

constarr1=[1,2,3]constarr2=[4,5,6]arr1.push(...arr2)console.log(arr1)// [1, 2, 3, 4, 5, 6]

优点:

  • 代码简洁,可读性强
  • 语法现代,符合 ES6+ 风格
  • 适合小数组快速合并

缺点:

  • 当数组元素超过约 65536 个时,会触发 JavaScript 引擎的最大参数数量限制,导致栈溢出错误
  • 扩展运算符需要先展开数组,会消耗额外内存
  • 大数组性能较差

适用场景:

  • 小数组(< 1000 个元素)
  • 快速脚本开发
  • 数量可控的场景

2. concat 方法:arr.concat(otherArr)

这是最"安全"的写法:

constarr1=[1,2,3]constarr2=[4,5,6]constmerged=arr1.concat(arr2)console.log(merged)// [1, 2, 3, 4, 5, 6]

优点:

  • 不会导致栈溢出,适合大数组
  • 语义清晰,代码可读性好
  • 返回新数组,不修改原数组(函数式编程友好)
  • 性能稳定,适合生产环境

缺点:

  • 会创建新数组,占用额外内存
  • 对于超大数组,内存占用会翻倍

适用场景:

  • 中大数组(> 1000 个元素)
  • 需要保持原数组不变
  • 函数式编程风格
  • 生产环境安全要求高

3. 循环 push:for (const item of arr) { target.push(item) }

这是最"稳"的写法:

constarr1=[1,2,3]constarr2=[4,5,6]for(constitemofarr2){arr1.push(item)}console.log(arr1)// [1, 2, 3, 4, 5, 6]

优点:

  • 最安全,绝对不会栈溢出
  • 内存占用最低(原地修改,不创建新数组)
  • 性能稳定,适合超大数组
  • 兼容性最好

缺点:

  • 代码相对冗长
  • 需要手动写循环
  • 会修改原数组

适用场景:

  • 超大数组(> 10000 个元素)
  • 内存敏感场景
  • 长时间运行的服务端任务
  • 需要最高性能的场景

性能对比表

方法栈溢出风险内存占用性能代码简洁度适用数组大小
push(...arr)⚠️ 高(>65536)差(大数组)⭐⭐⭐⭐⭐< 1000
concat()✅ 无中高⭐⭐⭐⭐> 1000
循环push()✅ 无最好⭐⭐⭐> 10000

实际案例对比

让我们看看在不同规模下的表现:

小数组(100 个元素)

// 三种方法都可以,性能差异可忽略constsmall=Array.from({length:100},(_,i)=>i)// 方法1:扩展运算符arr1.push(...small)// ✅ 推荐// 方法2:concatconstmerged=arr1.concat(small)// ✅ 也可以// 方法3:循环for(constitemofsmall)arr1.push(item)// ✅ 也可以,但没必要

中数组(10000 个元素)

constmedium=Array.from({length:10000},(_,i)=>i)// 方法1:扩展运算符arr1.push(...medium)// ⚠️ 可能栈溢出!// 方法2:concatconstmerged=arr1.concat(medium)// ✅ 推荐// 方法3:循环for(constitemofmedium)arr1.push(item)// ✅ 也可以

大数组(100000 个元素)

constlarge=Array.from({length:100000},(_,i)=>i)// 方法1:扩展运算符arr1.push(...large)// ❌ 几乎肯定会栈溢出!// 方法2:concatconstmerged=arr1.concat(large)// ⚠️ 可以,但内存占用高// 方法3:循环for(constitemoflarge)arr1.push(item)// ✅ 强烈推荐

进阶优化技巧

1. 分批处理超大数组

当数组特别大时,可以分批处理,避免一次性操作:

functionbatchConcat(target,source,batchSize=5000){for(leti=0;i<source.length;i+=batchSize){constbatch=source.slice(i,i+batchSize)target.push(...batch)// 小批次可以用扩展运算符}returntarget}// 使用consthuge=Array.from({length:100000},(_,i)=>i)constresult=[]batchConcat(result,huge)// 安全处理超大数组

2. 使用 Array.from 和展开运算符组合

对于需要转换的场景:

// 不推荐:可能栈溢出constmapped=arr.map(x=>x*2)result.push(...mapped)// 推荐:使用 concatconstmapped=arr.map(x=>x*2)result=result.concat(mapped)// 或者:直接循环for(constitemofarr){result.push(item*2)}

3. 流式处理(迭代器)

如果数据来自流或生成器,可以边读边处理:

asyncfunction*fetchData(){// 模拟分页数据流for(leti=0;i<10;i++){yieldawaitfetchPage(i)}}constresult=[]forawait(constpageoffetchData()){// 流式处理,内存占用低result.push(...page)// 每页数据量小,可以用扩展运算符}

常见错误示例

❌ 错误示例 1:批量导入时使用扩展运算符

// 批量导入 Excel,可能有上万行数据constexcelData=[]sheets.forEach((sheet)=>{constcurrent=xlsx.utils.sheet_to_json(workbook.Sheets[sheet])excelData.push(...current)// ❌ 如果数据量大,会栈溢出!})

正确做法:

constexcelData=[]sheets.forEach((sheet)=>{constcurrent=xlsx.utils.sheet_to_json(workbook.Sheets[sheet])// ✅ 使用 concat 或循环excelData=excelData.concat(current)// 或者// for (const row of current) excelData.push(row)})

❌ 错误示例 2:分页加载时使用扩展运算符

// 分页加载,累计可能有大量数据constloadMore=async()=>{constnewData=awaitfetchData(offset)allData.push(...newData)// ❌ 随着数据累积,可能栈溢出}

正确做法:

constloadMore=async()=>{constnewData=awaitfetchData(offset)// ✅ 使用 concatallData=allData.concat(newData)// 或者// for (const item of newData) allData.push(item)}

最佳实践建议

  1. 小数组(< 1000):随意,push(...arr)最简洁
  2. 中数组(1000 - 10000):优先使用concat(),安全可靠
  3. 大数组(> 10000):使用循环push(),性能最优
  4. 不确定大小时:保守选择concat()或循环push()
  5. 需要保持原数组不变:使用concat()
  6. 内存敏感场景:使用循环push(),原地修改

总结

数组合并看似简单,但在处理大规模数据时,选择合适的方法至关重要:

  • 扩展运算符push(...arr):适合小数组,代码简洁,但大数组会栈溢出
  • concat():适合中大数组,安全可靠,但会创建新数组
  • 循环push():适合超大数组,性能最优,内存占用最低

记住一个原则:不确定数组大小时,选择更安全的方法。在生产环境中,concat()和循环push()是更稳妥的选择。

希望这篇文章能帮助你在实际开发中避免栈溢出的坑!如果觉得有用,欢迎点赞收藏~

参考

  • MDN: Array.prototype.push()
  • MDN: Array.prototype.concat()
  • JavaScript 引擎参数限制

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

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

相关文章

SSM291的母婴用品商城网站

目录SSM291母婴用品商城网站摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM291母婴用品商城网站摘要 SSM291母婴用品商城网站是一个基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发的电子商务平台&…

python项目打包为镜像

1.生成 requirements.txt 在项目根目录下,使用 pipreqs生成依赖文件,确保镜像构建时安装正确的包 pip install pipreqs pipreqs . --encoding=utf8 --force 2.编写 Dockerfile # 使用官方 Python 轻量级镜像 FROM python:3.11-slim# 设置容器内工作目录 WORKDIR /app# 复制…

救命神器9个AI论文软件,专科生搞定毕业论文+格式规范!

救命神器9个AI论文软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; 专科生的毕业论文救星&#xff0c;AI工具如何帮你轻松过关&#xff1f; 对于许多专科生来说&#xff0c;毕业论文不仅是学术能力的考验&#xff0c;更是时间与精力的巨大挑战。尤其是在面对格式规范、…

知光项目对象存储模块

前言&#xff1a; 该文档只作为本人学习过程的记录&#xff0c;若还需要更详细的项目文档可以点击下方链接进行购买 文档地址 同时该项目已经在git上面开源&#xff0c;可以在购买前去看一下该项目。 项目后端的git地址&#xff1a;知光git后端地址 项目前端的git地址: 知…

【路径规划】基于RRT、RRT星、RRTX、A_和D_ Lite实现机器人路径规划附matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知。&#x1f525; 内容介绍机器人路径规划是自主移动机器人&…

fastapi里面tortoise-orm的用法

1.文档地址 https://blog.csdn.net/weixin_53909748/article/details/131747197 2.创建实体类,model/models.py from tortoise.models import Model from tortoise import fieldsclass Teacher(Model):id = fields.IntField(pk=True)name = fields.CharField(max_length=25…

【无人机三维路径规划】基于蚁群算法ACO、蜣螂算法DBO、人工蜂鸟算法AHA复杂山地模型下无人机路径规划附Matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知。&#x1f525; 内容介绍一、技术背景与核心目标无人机三维路…

【初阶数据结构】解锁顺序表潜能:一站式实现高效通讯录系统

&#x1f525;小龙报&#xff1a;个人主页 &#x1f3ac;作者简介&#xff1a;C研发&#xff0c;嵌入式&#xff0c;机器人等方向学习者 ❄️个人专栏&#xff1a;《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生 文章目录前言一、通讯录框架Test.c二、通讯…

大数据领域数据服务的用户需求挖掘方法

大数据领域数据服务的用户需求挖掘&#xff1a;从“拍脑袋”到“系统性解题” 在大数据行业摸爬滚打5年&#xff0c;我见过太多“叫好不叫座”的数据服务&#xff1a; 花费3个月开发的“实时销售看板”&#xff0c;上线后运营人员说“不如Excel好用”&#xff1b;投入百万搭建的…

西门子S7 200smart与欧姆龙E5cc温控器通讯实战

西门子S7 200smart与欧姆龙E5cc温控器通讯程序 功能&#xff1a;通过西门子s7 200smart与欧姆龙e5cc温控器modbus通讯&#xff0c;实现目标温度设定&#xff0c;实际温度读取&#xff0c;设定报警类型&#xff0c;报警值&#xff0c;报警值上下限&#xff0c;探头型号设定等功能…

【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 2:论文

【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 1:介绍 代码 GitHub: https://github.com/multimodal-art-projection/AutoMV Website: https://m-a-p.ai/AutoMV/ Abstract 摘要 Music-to-Video (M2V) generation for full-lengt…

【AIGC】2025年12月13日 AutoMV: Automatic Multi-Agent System for Music Video Generation 1:介绍

AutoMV: Automatic Multi-Agent System for Music Video Generation AutoMV:用于音乐视频生成的自动多智能体系统 无需训练 AutoMV is a training-free, multi-agent system that automatically generates coherent, long-form music videos (MVs) directly from a full-leng…

SSM289的美食推荐带店铺管理系统

目录SSM289美食推荐与店铺管理系统摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM289美食推荐与店铺管理系统摘要 SSM289是一款基于SSM&#xff08;SpringSpring MVCMyBatis&#xff09;框架开发的美食推荐与店铺管理系…

SSM278的考研互助辅导平台vue

目录 SSM278考研互助辅导平台Vue实现摘要 开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; SSM278考研互助辅导平台Vue实现摘要 SSM278考研互助辅导平台基于Vue.js框架开发&#xff0c;整合Spring、Spring MVC和MyBatis&#x…

S7-1200 控制 5 轴伺服程序案例分享

S7-1200控制5轴伺服程序案例。1.PTO伺服轴脉冲定位控制功能应用速度模式应用扭矩模式应用。 2.程序为结构化编程,每一功能为模块化设计,具有一个项目都有的功能:自动_手动_单步_暂停后原位置继续运行_轴断电保持_报警功能_气缸运行及报警. 3.每个功能块可以无数次重复调用&…

生产线效率已近瓶颈,如何通过精益管理实现新的突破?

泻药&#xff0c;生产线效率已近瓶颈&#xff0c;如何通过精益管理实现新的突破&#xff1f;这个问题&#xff0c;其实我在很多制造企业里反复听到过。老板常说的是一句话&#xff1a;“人已经很忙了&#xff0c;设备也没少开&#xff0c;但效率就是上不去。”再追问几句&#…

电力系统复杂网络分析:MATLAB 实现最优微电网布局

电力系统复杂网络分析 matlab源代码&#xff0c;代码按照高水平文章复现&#xff0c;保证正确 电力系统复杂网络分析(CAN) 利用复杂网络分析方法&#xff0c;求解配网系统中微电网最优位置的新&#xff0c;该位置将增强电网的弹性&#xff0c;减少电力损失和线路负荷&#xff0…

计算机毕业设计springboot医院门诊信息管理系统 基于SpringBoot的智慧门诊综合服务平台 面向中小型医院的SpringBoot门诊业务一体化系统

计算机毕业设计springboot医院门诊信息管理系统v1oug17b &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“看病难、排队久、信息孤岛”成为医院门诊的普遍痛点时&#xff0c;一…

Kiro教程(三)| Kiro 实战与最佳实践

Kiro教程&#xff08;三&#xff09;| Kiro 实战与最佳实践 Kiro 实战与最佳实践案例 1&#xff1a;从零开发 Todo 应用&#xff08;Spec 模式&#xff09;项目要求Step 1&#xff1a;创建项目并配置 SteeringStep 2&#xff1a;启动 SpecStep 3&#xff1a;审核三阶段文档 案例…

URL末尾到底该不该加斜杠?前端老油条的血泪经验

URL末尾到底该不该加斜杠&#xff1f;前端老油条的血泪经验URL末尾到底该不该加斜杠&#xff1f;前端老油条的血泪经验引言&#xff1a;这事儿真没你想的那么简单先搞清楚服务器眼里的斜杠是啥浏览器和搜索引擎怎么看这事重定向风暴&#xff1a;你网站慢可能就因为这个前端路由…