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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82882.shtml
英文地址,請注明出處:http://en.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;性能測試體系性能測試基礎性能測試工具性能監控…