深淺拷貝區別,怎么區別使用

在 JavaScript 中,深拷貝(Deep Copy)?和?淺拷貝(Shallow Copy)?是兩種不同的對象復制方式,它們的區別主要體現在對嵌套對象的處理上。以下是它們的詳細對比及使用場景:


1.?淺拷貝(Shallow Copy)

  • 定義:

    • 淺拷貝只復制對象的第一層屬性,如果屬性是基本類型(如?stringnumberboolean),則直接復制值;如果屬性是引用類型(如?objectarray),則復制引用(內存地址)。

    • 淺拷貝后的對象和原對象共享嵌套的引用類型數據。

  • 實現方式:

    • 使用?Object.assign():

      const obj = { a: 1, b: { c: 2 } };
      const shallowCopy = Object.assign({}, obj);
    • 使用擴展運算符(...):

      const obj = { a: 1, b: { c: 2 } };
      const shallowCopy = { ...obj };
  • 特點:

    • 修改淺拷貝對象的第一層屬性不會影響原對象。

    • 修改淺拷貝對象的嵌套對象屬性會影響原對象。

  • 示例:

    const obj = { a: 1, b: { c: 2 } };
    const shallowCopy = { ...obj };shallowCopy.a = 10; // 修改第一層屬性
    shallowCopy.b.c = 20; // 修改嵌套對象屬性console.log(obj); // { a: 1, b: { c: 20 } } (嵌套對象被修改)
    console.log(shallowCopy); // { a: 10, b: { c: 20 } }

2.?深拷貝(Deep Copy)

  • 定義:

    • 深拷貝會遞歸復制對象的所有層級屬性,包括嵌套的引用類型數據。

    • 深拷貝后的對象和原對象完全獨立,互不影響。

  • 實現方式:

    • 使用?JSON.parse(JSON.stringify()):

      const obj = { a: 1, b: { c: 2 } };
      const deepCopy = JSON.parse(JSON.stringify(obj));
      • 注意:這種方法無法復制函數、undefinedSymbol?等特殊類型。

    • 使用遞歸函數或工具庫(如 Lodash 的?_.cloneDeep):

      const _ = require('lodash');
      const obj = { a: 1, b: { c: 2 } };
      const deepCopy = _.cloneDeep(obj);
  • 特點:

    • 修改深拷貝對象的任何屬性都不會影響原對象。

    • 深拷貝會完全復制對象的所有層級數據。

  • 示例:

    const obj = { a: 1, b: { c: 2 } };
    const deepCopy = JSON.parse(JSON.stringify(obj));deepCopy.a = 10; // 修改第一層屬性
    deepCopy.b.c = 20; // 修改嵌套對象屬性console.log(obj); // { a: 1, b: { c: 2 } } (原對象不受影響)
    console.log(deepCopy); // { a: 10, b: { c: 20 } }

3.?淺拷貝和深拷貝的區別

特性淺拷貝(Shallow Copy)深拷貝(Deep Copy)
復制層級只復制第一層屬性遞歸復制所有層級屬性
嵌套對象嵌套對象是引用(共享內存地址)嵌套對象是獨立的(不共享內存地址)
性能性能較高性能較低(遞歸復制)
實現方式Object.assign()、擴展運算符JSON.parse(JSON.stringify())、遞歸函數、工具庫
適用場景對象結構簡單,無需復制嵌套對象對象結構復雜,需要完全獨立的對象

4.?如何選擇使用淺拷貝和深拷貝

  • 使用淺拷貝的場景:

    • 對象結構簡單,沒有嵌套對象或數組。

    • 只需要復制第一層屬性,且不關心嵌套對象是否共享。

    • 性能要求較高,且不需要完全獨立的對象。

  • 使用深拷貝的場景:

    • 對象結構復雜,包含嵌套對象或數組。

    • 需要完全獨立的對象,修改拷貝對象不影響原對象。

    • 不關心性能開銷,且需要完整的復制。


5.?總結

  • 淺拷貝:

    • 只復制第一層屬性,嵌套對象是引用。

    • 適合簡單對象或性能敏感的場景。

  • 深拷貝:

    • 遞歸復制所有層級屬性,嵌套對象是獨立的。

    • 適合復雜對象或需要完全獨立的場景。

根據實際需求選擇合適的拷貝方式,可以避免不必要的性能開銷和潛在的錯誤。

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

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

相關文章

tailscale + derp中繼 + 阿里云服務器 (無域名版)

使用tailscale默認的中轉節點延遲很高,因為服務器都在國外。 感謝大佬提供的方案:Tailscale 搭建derp中繼節點,不需要域名,不需要備案,不需要申請證書(最新) - yafeng - 博客園 基于這個方案&…

【異常錯誤】pycharm debug view變量的時候顯示不全,中間會以...顯示

異常問題: 這個是在新版的pycharm中出現的,出現的問題,點擊view后不全部顯示,而是以...折疊顯示 在setting中這么設置一下就好了: 解決辦法: https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

【DeepSeek系列】04 DeepSeek-R1:帶有冷啟動的強化學習

文章目錄 1、簡介2、主要改進點3、兩個重要觀點4、四階段后訓練詳細步驟4.1 冷啟動4.2 推理導向的強化學習4.3 拒絕采樣和有監督微調4.4 針對所有場景的強化學習 5、蒸餾與強化學習對比6、評估6.1 DeepSeek-R1 評估6.2 蒸餾模型評估 7、結論8、局限性與未來方向 1、簡介 DeepS…

車載音頻配置(二)

目錄 OEM 自定義的車載音頻上下文 動態音頻區配置 向前兼容性 Android 14 車載音頻配置 在 Android 14 中,AAOS 引入了 OEM 插件服務,使你可以更主動地管理由車載音頻服務監督的音頻行為。 隨著新的插件服務的引入,車載音頻配置文件中添加了以下更改: ? OEM 自定義的車…

禁止WPS強制打開PDF文件

原文網址:禁止WPS強制打開PDF文件_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹如何避免WPS強制打開PDF文件。 方法 1.刪除注冊表里.pdf的WPS綁定 WinR,輸入:regedit,回車。找到:HKEY_CLASSES_ROOT\.pdf刪除KWPS.PDF…

深入解析NoSQL數據庫:從文檔存儲到圖數據庫的全場景實踐

title: 深入解析NoSQL數據庫:從文檔存儲到圖數據庫的全場景實踐 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通過電商、社交網絡、物聯網等12個行業場景,結合MongoDB聚合管道、Redis Stream實時處理、Cassandra SSTable存儲引擎、Neo4j路徑遍歷算法等42…

用 Biome 替代 ESLint 和 Prettier

簡介 ESLint 和 Prettier ESLint:代碼質量檢查工具,確保代碼風格一致與無錯誤 Prettier:代碼格式化工具,自動美化代碼布局 所以:ESLint Prettier 能自動美化代碼、自動檢查代碼錯誤的工具 Biome Biome:…

6.3 DBMS的功能和特征

文章目錄 DBMS的6大功能DBMS的3個特征DBMS的分類 DBMS的6大功能 DBMS包含數據定義,數據庫操作(檢索、插入、修改、刪除),數據庫運行管理(保證多用戶環境下正常運行),數據組織、存儲、管理&…

力扣hot100——找到字符串中的所有字母異位詞

給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。 解法思路: 1. // 判斷字符相等,其實就是給定一個定長的窗口去滑動查找子串,為了便于判斷將p 與窗口中的子…

前端插件使用xlsx-populate,花樣配置excel內容,根據坐添加標替換excel內容,修改顏色,合并單元格...。

需求要求:業務人員有個非常復雜得excel表格,各種表頭等,但是模板是固定得。當然也可以實現在excel上搞出各種表格,但是不如直接用已有模板替換其中要動態得內容方便,這里我們用到CSDN得 xlsx-populate 插件。 實列中我…

未來AI方向落地場景:小語言模型,super_private_agent

未來AI方向落地場景:小語言模型,super_private_agent 目錄 未來AI方向落地場景:小語言模型,super_private_agent小語言模型super - private - agent(注重隱私的智能代理)碳基生命和硅基生命交互界面面向agent的專用交互協議和數據接口從web平臺經濟到網絡平臺舉例說明社交…

Coze扣子新功能詳解

今晚(2025-01-24)扣子再次進行更新 主要更新內容: 搭建小程序和 H5 用戶界面時,支持使用音頻組件播放音頻內容 數據庫操作體驗提升 界面優化:對數據庫詳情界面進行了重新設計,并將工作流運行數據庫的測試數據位置從原工作流底…

匯能感知的光譜相機/模塊產品有哪些?

CM020A 分辨率:1600H1200V 光譜范圍:350~950nm 光譜分辨率:1nm 接口:USB2.0 幀率:16001200 (6幀) 輸出格式:Raw 8bit FOV:D73.5H58.8V44.1 相機尺寸:505055mm VM02S10 分辨率…

Ollama 本地GUI客戶端:為DeepSeek用戶量身定制的智能模型管理與交互工具

Ollama 本地GUI客戶端:為DeepSeek用戶量身定制的智能模型管理與交互工具 相關資源文件已經打包成EXE文件,可雙擊直接運行程序,且文章末尾已附上相關源碼,以供大家學習交流,博主主頁還有更多Python相關程序案例&#xf…

OpenMv識別色塊通過串口發給STM32

硬件連接 1、Openmv端 這里OpenMV端僅作為數據的發送端,所以只需要共地,以及OpenMV的TX(P4)與開發板的RX端連接即可。 2、STM32端 將開發板連接STM芯片RX端與轉串口TX端的跳帽取下,再將OpenMV的TX端(P4)與STM的RX連接。如果使用USB轉TTL則將TTL的RX端與STM的TX端連接…

以太網交換基礎(涵蓋二層轉發原理和MAC表的學習)

在當今的網絡世界中,以太網交換技術是局域網(LAN)的核心組成部分。無論是企業網絡、學校網絡還是家庭網絡,以太網交換機都扮演著至關重要的角色。本文將詳細介紹以太網交換的基礎知識,包括以太網協議、幀格式、MAC地址…

菜鳥之路Day15一一IO流(一)

菜鳥之路Day15一一IO流(一) 作者:blue 時間:2025.2.8 文章目錄 菜鳥之路Day15一一IO流(一)0.概述1.初識IO流1.1.什么是IO流?1.2.IO流的作用1.3.IO流的分類 2.IO流的體系結構3.字節輸出流的基本…

汽車零部件開發應該具備哪些編程思維?

目錄 1、功能安全思維 2、實時性與確定性思維 3、可靠性和冗余思維 4、硬件軟件協同思維 5、CAN總線通信思維 6、故障診斷和自診斷思維 7、功耗優化思維 8、軟件更新和版本管理思維 9、用戶體驗與安全性思維 汽車零部件開發中,嵌入式軟件在車輛系統中的作用…

idea拉取合并后的分支

文章目錄 遠程拉取代碼.更新本地庫拉取后本地庫就有了合并后的代碼 遠程拉取代碼.更新本地庫 拉取后本地庫就有了合并后的代碼

1-18 GIT設置公鑰

1-1 GIT如何設置公鑰 1.0 注冊賬號 這個應該都是會的,就不做介紹了 2.0 設置公鑰 PWD的作用是查看文件的路徑 ssh-keygen -t ed25519 -C "Gitee SSH Key" 讀取公鑰文件: cat ~/.ssh/id_ed25519.pub 3.0 測試 查看綁定的用戶名和郵箱&#xff1…