javascript 深拷貝和淺拷貝的區別及具體實現方案

一、核心區別

特性淺拷貝深拷貝
復制層級僅復制對象的第一層屬性遞歸復制對象的所有層級屬性(包括嵌套對象和數組)
引用關系嵌套對象/數組與原對象共享內存(引用拷貝)嵌套對象/數組與原對象完全獨立(值拷貝)
修改影響修改拷貝后的嵌套屬性會影響原對象修改拷貝后的任何屬性都不會影響原對象
適用場景簡單數據結構,無需嵌套獨立性復雜數據結構,要求完全獨立

二、淺拷貝實現方案

1. 對象淺拷貝
  • Object.assign()
    const obj = { a: 1, b: { c: 2 } };
    const shallowCopy = Object.assign({}, obj);
    
  • 展開運算符(...
    const obj = { a: 1, b: { c: 2 } };
    const shallowCopy = { ...obj };
    
2. 數組淺拷貝
  • Array.prototype.slice()
    const arr = [1, 2, [3, 4]];
    const shallowCopy = arr.slice();
    
  • 展開運算符(...
    const arr = [1, 2, [3, 4]];
    const shallowCopy = [...arr];
    

三、深拷貝實現方案

1. JSON 序列化法

原理:通過 JSON.stringify()JSON.parse() 序列化對象。
優點:簡單快捷,適合純數據對象。
缺點:無法處理函數、undefinedSymbolDateRegExp、循環引用等。

const obj = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(obj));
2. 遞歸深拷貝(手動實現)

原理:遞歸遍歷對象屬性,處理所有數據類型。
優點:可自定義邏輯,支持復雜場景。
缺點:需處理邊界條件(如循環引用)。

function deepClone(source, hash = new WeakMap()) {// 處理基本類型和 null/undefinedif (source === null || typeof source !== 'object') return source;// 處理循環引用if (hash.has(source)) return hash.get(source);// 處理 Date 和 RegExpif (source instanceof Date) return new Date(source);if (source instanceof RegExp) return new RegExp(source);// 初始化拷貝對象(保持原型鏈)const target = new source.constructor();hash.set(source, target);// 遍歷所有屬性(包括 Symbol)Reflect.ownKeys(source).forEach(key => {target[key] = deepClone(source[key], hash);});return target;
}
3. 第三方庫實現
  • Lodash(推薦)

    import { cloneDeep } from 'lodash';
    const deepCopy = cloneDeep(obj);
    
  • jQuery

    const deepCopy = $.extend(true, {}, obj);
    

四、特殊場景處理

1. 循環引用

問題:對象屬性間接引用自身,導致遞歸棧溢出。
解決方案:使用 WeakMap 緩存已拷貝對象。

const obj = { a: 1 };
obj.self = obj; // 循環引用
const copy = deepClone(obj); // 遞歸實現中通過 WeakMap 避免死循環
2. 處理特殊對象
  • Date 對象:通過 new Date(source.getTime()) 重建。
  • RegExp 對象:通過 new RegExp(source.source, source.flags) 重建。
  • Map/Set:遍歷并遞歸拷貝每個元素。
3. 函數拷貝

問題:函數無法被完全拷貝(可能依賴閉包環境)。
解決方案:通過 evalnew Function 重建函數(需謹慎使用)。

五、性能對比與選型建議

方法性能功能完整性安全性
JSON 法低(丟失類型)安全
遞歸實現需處理邊界
Lodash安全

選型建議

  • 純數據對象且無特殊類型 → JSON 法
  • 復雜對象或需要保留類型 → Lodash 的 cloneDeep
  • 定制化需求 → 手動遞歸實現

六、驗證示例

const origin = { a: 1, b: { c: 2 }, d: new Date(), e: /regex/, f: function() { console.log('test') },g: [1, 2, { h: 3 }]
};
origin.self = origin; // 循環引用const copy = deepClone(origin);// 驗證
console.log(copy.b === origin.b); // false(深拷貝成功)
console.log(copy.d instanceof Date); // true(保留類型)
console.log(copy.self === copy); // true(循環引用處理成功)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79390.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pytorch對應gpu版本是否可用判斷邏輯

# gpu_is_ok.py import torchdef check_torch_gpu():# 打印PyTorch版本print(f"PyTorch version: {torch.__version__}")# 檢查CUDA是否可用cuda_available torch.cuda.is_available()print(f"CUDA available: {cuda_available}")if cuda_available:# 打印…

國內無法訪問GitHub官網的問題解決

作為一名程序員,在國內訪問GitHub官網經常會遇到打開過慢或者訪問失敗的問題,但通過一些技巧可以改善訪問體驗。GitHub訪問問題的根源在于GitHub官網訪問不穩定的主要原因在于DNS解析過程。當我們直接訪問github.com時,需要通過DNS服務器將域…

使用 MediaPipe 和 OpenCV 快速生成人臉掩膜(Face Mask)

在實際項目中,尤其是涉及人臉識別、換臉、圖像修復等任務時,我們經常需要生成人臉區域的掩膜(mask)。這篇文章分享一個簡單易用的小工具,利用 MediaPipe 和 OpenCV,快速提取人臉輪廓并生成二值掩膜圖像。 …

【動態導通電阻】GaN功率器件中動態導通電阻退化的機制、表征及建模方法

2019年,浙江大學的Shu Yang等人在《IEEE Journal of Emerging and Selected Topics in Power Electronics》上發表了一篇關于GaN(氮化鎵)功率器件動態導通電阻(Dynamic On-Resistance, RON)的研究論文。該文深入探討了GaN功率器件中動態導通電阻退化的機制、表征方法、建模…

從括號匹配看棧:數據結構入門的實戰與原理

在計算機科學的世界里,數據結構是程序員的 “瑞士軍刀”,不同的數據結構適用于不同的場景,能高效解決各類問題。其中,棧作為一種簡單卻強大的數據結構,在很多實際應用中發揮著關鍵作用。今天,我們就通過一個…

Dubbo(89)如何設計一個支持多語言的Dubbo服務?

設計一個支持多語言的Dubbo服務需要考慮以下幾個方面: 服務接口設計:確保服務接口的定義可以被不同語言實現。序列化協議:選擇一個支持多語言的序列化協議,例如Protobuf、Thrift、gRPC等。服務注冊與發現:確保服務注冊…

力扣面試150題--分隔鏈表

day 39 題目描述 思路 遍歷鏈表,每一個點與值比較,比值小就繼續,比值大就放到鏈表尾部即可 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int…

VSCode 查看文件的本地修改歷史

1. 使用時間線視圖(Timeline) 新版 VSCode 內置了一個叫 Timeline(時間線) 的功能,可以查看: 本地文件修改記錄(包括保存歷史)Git 提交歷史(如果倉庫是 Git 管理的&…

C++學習-入門到精通-【3】控制語句、賦值、自增和自減運算符

C學習-入門到精通-【3】控制語句、賦值、自增和自減運算符 控制語句、賦值、自增和自減運算符 C學習-入門到精通-【3】控制語句、賦值、自增和自減運算符一、什么是算法二、偽代碼三、控制結構順序結構選擇結構if語句if...else語句switch語句 循環結構while語句 四、算法詳述&a…

父子組件雙向綁定

v-model 語法糖實現 vue中我們在input中可以直接使用v-model來完成雙向綁定,這個時候 v-model 通常會幫我們完成兩件事: v-bind:value的數據綁定@input的事件監聽如果我們現在封裝了一個組件,其他地方在使用這個組件時,是否也可以使用v-model來同時完成這兩個功能呢? 當我…

用Selenium開啟自動化網頁交互與數據抓取之旅

用Selenium開啟自動化網頁交互與數據抓取之旅 在當今數字化時代,數據的價值不言而喻,而網頁作為海量數據的重要載體,如何高效獲取其中的關鍵信息成為眾多開發者和數據愛好者關注的焦點。Selenium這一強大工具,為我們打開了自動化…

VB.net序列化和反序列化的使用方法和實用場景

引言 相信很多初學編程的人都會提出過這個疑問:“既然我的變量可以存在內存之中,那么是否也可以存在硬盤之中呢” 其實我想回答的是,完全可以而且方法不止一種,而今天講的是序列化最經典的——二進制序列化 由于序列化的部分已…

Android OTA

一、OTA運行原理 Android 平臺提供 Google diff arithmetic 差分機制,升級包支持完整升級以及差分升級,OTA 運行原理圖如下所示。 1. OTA Server 負責對更新包進行上傳,下載以及版本的管理。 2. 開發者在修改 Android 系統后,通…

Untiy基礎學習(三)Untiy中編寫腳本的基本規則

一、怎么創建腳本 在Project窗口下,右鍵Create C#Script 即可創建腳本 創建腳本的注意事項 : 1)類名和文件名必須一致,不然不能掛載(因為反射機制創建對象,會通過文件名去找Type) 2)沒有特殊需…

VBA宏即根據第一列的內容和第二列的數字,按照數字數量生成對應內容并依次放在第三列、第四列等

打開你的 Excel 工作表。按下 Alt F11 組合鍵,打開 VBA 編輯器。在 VBA 編輯器中,點擊 插入 -> 模塊。在模塊窗口中,輸入以下 VBA 代碼: Sub GenerateItems()Dim lastRow As LongDim i As Long, j As LongDim item As String…

深度學習系統學習系列【1】之基本知識

文章目錄 說明基礎知識人工智能、機器學習、深度學習的關系機器學習傳統機器學習的缺陷選擇深度學習的原因深度學習的關鍵問題深度學習的應用深度學習的加速硬件GPU環境搭建主流深度學習框架對比 說明 文章屬于個人學習筆記內容,僅供學習和交流。內容參考深度學習原…

論文筆記-基于多層感知器(MLP)的多變量橋式起重機自適應安全制動與距離預測

《IET Cyber-Systems and Robotics》出版山東大學 Tenglong Zhang 和 Guoliang Liu 團隊的研究成果,文章題為“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 橋式起重機的緊急制動及其制動距離預測是…

DeepSeek實戰--各版本對比

1.對比 版本參數量優勢劣勢使用場景競品DeepSeek-V36710億(MoE架構,激活370億)開源、高效推理(60 TPS)、低成本(API費用低)、中文處理能力突出(90%準確率多模態能力有限通用任務&am…

從0開始建立Github個人博客(hugoPaperMod)

從0開始建立Github個人博客(hugo&PaperMod) github提供給每個用戶一個網址,用戶可以建立自己的靜態網站。 一、Hugo hugo是一個快速搭建網站的工具,由go語言編寫。 1.安裝hugo 到hugo的github標簽頁Tags gohugoio/hugo選擇一個版本&#xff0c…

【AI論文】WebThinker:賦予大型推理模型深度研究能力

摘要:大型推理模型(LRMs),如OpenAI-o1和DeepSeek-R1,展示了令人印象深刻的長期推理能力。 然而,他們對靜態內部知識的依賴限制了他們在復雜的知識密集型任務上的表現,并阻礙了他們生成需要綜合各…