当前位置: 首页 > java >正文

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.xdnf.cn/news/10063.html

相关文章:

  • MySQL + CloudCanal + Iceberg + StarRocks 构建全栈数据服务
  • 单元测试报错
  • 由反汇编代码确定结构体的完整声明
  • 调试技巧总结
  • SAP 生产订单收货数量超额报错问题研究
  • 《java创世手记》---java基础篇(上)
  • 【Linux基础知识系列】第五篇-软件包管理
  • Ubuntu本地文件上传github(版本控制)
  • 常见压缩算法性能和压缩率对比 LZ4 LZO ZSTD SNAPPY
  • Haproxy搭建web群集
  • WWW22-可解释推荐|用于推荐的神经符号描述性规则学习
  • 【免费的高清录屏软件】OBS Studio
  • 架构加速-深度学习教程
  • A类地址中最小网络号(0.x.x.x) 默认路由 / 无效/未指定地址
  • Qt中使用正则表达式来提取字符串
  • 第100+41步 ChatGPT学习:R语言实现误判病例分析
  • Windows 权限提升 | TryHackMe | Windows Privilege Escalation
  • html中使用nginx ssi插入html
  • 全志科技携飞凌嵌入式T527核心板亮相OpenHarmony开发者大会
  • 智能守护电网安全:探秘输电线路测温装置的科技力量
  • MySQL高可用集群
  • 《Linux C编程实战》笔记:套接字编程
  • day41 python图像识别任务
  • 【多线程初阶】线程状态 线程安全
  • 进阶智能体实战九、图文需求分析助手(ChatGpt多模态版)(帮你生成 模块划分+页面+表设计、状态机、工作流、ER模型)
  • Ubuntu 安装 FSL 及多模态脑MRI的去颅骨处理(含 HD-BET 深度学习方法)
  • 区域未停留检测算法AI智能分析网关V4打造铁道/工厂/机场等场景应用方案
  • mysql隐式转换会造成索引失效的原因
  • 软件评测机构如何保障质量?检测资质、技术实力缺一不可
  • 历年浙江大学计算机保研上机真题