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

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.lryc.cn/news/2393289.html

相关文章:

  • 人工智能与机器学习从理论、技术与实践的多维对比
  • Netty 实战篇:手写一个轻量级 RPC 框架原型
  • 什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程
  • 亚远景-ISO 21434标准:汽车网络安全实践的落地指南
  • 【动手学深度学习】2.4. 微积分
  • 流程自动化引擎:让业务自己奔跑
  • AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力
  • 用 Python 模拟雪花飘落效果
  • 基于定制开发开源AI智能名片S2B2C商城小程序的大零售渗透策略研究
  • 重拾Scrapy框架
  • Day 40
  • XPlifeapp:高效打印,便捷生活
  • 等保测评-Mysql数据库测评篇
  • CSS篇-2
  • 02.K8S核心概念
  • 一套qt c++的串口通信
  • 【高频面试题】数组中的第K个最大元素(堆、快排进阶)
  • Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索
  • 基于Python的单斜式ADC建模与仿真分析
  • 笔记本电脑右下角wifi不显示,连不上网怎么办?
  • 一篇文章玩转CAP原理
  • Vue-收集表单信息
  • 私服 nexus 之间迁移 npm 仓库
  • 微服务及容器化设计--可扩展的架构设计
  • vscode开发stm32,main.c文件中出现很多报错影响开发解决日志
  • 嵌入式鸿蒙系统中水平和垂直以及图片调用方法
  • 【海康USB相机被HALCON助手连接过后,MVS显示无法连接故障。】
  • 面试大厂Java:从Spring Boot到微服务架构
  • 2025年电气工程与轨道交通国际会议:绿色能源与智能交通的创新之路
  • macOS 安装 Grafana + Prometheus + Node Exporter