」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 JavaScript 的 StructuredClone() 進行深度物件克隆

如何使用 JavaScript 的 StructuredClone() 進行深度物件克隆

發佈於2024-11-08
瀏覽:957

How to Use JavaScript

目錄

  • 介紹
  • 理解並使用 StructuredClone
  • 結論

介紹

您是否曾經嘗試過使用擴展運算符 (...) 在 Javascript 中複製對象,卻發現對原始對象的更改仍然會影響副本?當您期望一份獨立於原件的副本但最終卻有一個連結到原件時,這可能會令人沮喪。這是處理深層物件時的常見問題,並且可能會導致意外的錯誤。值得慶幸的是,Javascript 有 StructuredClone() 方法來解決這個問題

理解並使用 StructuredClone()

首先,Javascript 中的 StructuredClone() 方法用於製作物件的深層複製,包括那些具有嵌套結構(如陣列、物件和其他複雜資料類型)的物件。

您可能想知道:copy 到底是什麼,JavaScript 中有多少種類型的複製?好吧,我們有副本。雖然我們知道 StructuredClone() 創建後者,但使用 擴展運算子 創建前者。

A shallow copy 僅複製物件的頂級屬性,這表示嵌套物件或陣列仍從原始物件或陣列中引用。另一方面,深層複製複製所有內容,包括嵌套結構,確保克隆完全獨立於原始版本。

讓我們來看看javascript中淺拷貝和深拷貝的一些例子

淺複製範例

const person = {
    name: "John Doe", 
    languages: [
       "English", 
       "German"
    ]
};

const personClone = {...person}; // shallow copy

// Modify the languages array in the cloned object
personClone.languages.push("Spanish");

// Check the original and the cloned object
console.log(person.languages);  // Output: ["English", "German", "Spanish"]
console.log(personClone.languages);  // Output: ["English", "German", "Spanish"]
console.log(person.languages === personClone.languages) // true

// However, changing a primitive value won't affect the original
personClone.name = "Jane Doe";

console.log(person.name);  // Output: "John Doe"
console.log(personClone.name);  // Output: "Jane Doe"
console.log(person.name === personClone.name) // false

從上面的程式碼,我們可以得到以下結論:

  • name屬性是一個原始值,因此在淺拷貝(personClone.name = "Jane Doe";)中更改它不會影響原始的(person.name)
  • languages 數組是非原始數組,因此原始數組(person)和克隆數組(personClone)共享相同的引用。修改personClone數組會影響原來的person數組

深度複製範例

const person = {
    name: "John Doe", 
    languages: [
       "English", 
       "German"
    ]
};

// Create a deep copy using structuredClone
const deepClonedPerson = structuredClone(person);

// Modify the deep cloned object
deepClonedPerson.languages.push("Spanish");

// Check if the original and the deep clone are equal
console.log(person === deepClonedPerson);  // Output: false
console.log(person.languages) // ['English', 'German']
console.log(deepClonedPerson.languages) // ['English', 'German', 'Spanish']
console.log(person.languages === deepClonedPerson.languages);  // Output: false

// Check if the properties are equal
console.log(person.name === deepClonedPerson.name);  // Output: false

// Changes in the deep cloned object don't affect the original
deepClonedPerson.name = "Jane Doe";

console.log(person.name);  // Output: "John Doe"
console.log(deepClonedPerson.name);  // Output: "Jane Doe"

從上面的程式碼,我們可以得到以下結論:

  • person === deepClonedPerson 確認 StructuredClone() 建立了一個新的獨立物件。
  • person.languages === deepClonedPerson.languages 顯示嵌套數組也是獨立複製的。
  • 檢查 person.name === deepClonedPerson.name 驗證深度克隆的變更不會影響原始物件。
  • 語言的值顯示對深度克隆(deepClonedPerson)的修改不會反映在原始(person)中

結論

在本文中,我們探討了 StructuredClone() 方法如何提供可靠的方法來建立物件的深層副本,確保嵌套結構完全獨立於原始結構。

感謝您閱讀本文。如果您發現本文有幫助,請按讚並分享給其他可能從學習 Javascript 中的深度複製中受益的人

您對這個主題有何看法?您是否遇到過其他在 Javascript 中複製物件的技術?請隨時在下面的評論部分分享您的見解。

P.S. 我目前正在尋找前端開發人員的機會。如果您有任何線索或正在招聘,請隨時查看我的履歷或在 LinkedIn 上與我聯繫。我很想聽聽你的消息!

版本聲明 本文轉載於:https://dev.to/devyoma/how-to-use-javascripts-structuredclone-for-deep-object-cloning-194h?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 使用 PHP 和 JavaScript 將網頁下載為 PDF
    使用 PHP 和 JavaScript 將網頁下載為 PDF
    在 PHP 中將 HTML 轉換為 PDF 很容易。讓我們更進一步,使用 PHP 和 JavaScript 將網頁轉換為 PDF 檔案。 為此,您需要安裝 Composer 和 Node。 安裝這些東西後,您需要使用 Composer 安裝 Dompdf,並使用 npm(Node 套件管理器)...
    程式設計 發佈於2024-11-08
  • 4 年內建構 AI 代理的頂級框架
    4 年內建構 AI 代理的頂級框架
    Hola,我是 Nomadev!如果您像我一样,您可能已经注意到人工智能代理正在席卷世界。说真的,人工智能代理不仅仅是炒作,它们已经在为智能系统提供动力、自动化任务并代表企业做出决策。我一直在深入研究这个领域,相信我,未来是由代理驱动的。 现在,如果您想成为这场革命的一部分并构建自己的人工智能代理...
    程式設計 發佈於2024-11-08
  • 每個開發人員都應該了解的基本 Express 請求屬性
    每個開發人員都應該了解的基本 Express 請求屬性
    在專案後端工作時,處理請求和回應至關重要。有效管理這些請求對於客戶端和伺服器之間的順利通訊至關重要。以下是每個開發人員都應該熟悉的一些常見且重要的請求屬性。 1. 請求ip Express.js 中的 req.ip 是請求物件的屬性,它提供發出請求的客戶端的 IP 位址。它傳回一個...
    程式設計 發佈於2024-11-08
  • 如何解決 Doctrine 左連接期間的「Expected Doctrine\\ORM\\Query\\Lexer::T_WITH, got 'ON'\」錯誤?
    如何解決 Doctrine 左連接期間的「Expected Doctrine\\ORM\\Query\\Lexer::T_WITH, got 'ON'\」錯誤?
    如何在Doctrine 中執行左連接當使用複雜的資料模型時,有必要透過建立多個表之間的關係來從多個表中檢索資料。左連接允許您從一個表中獲取所有行,並且僅從另一個表中獲取匹配的行。 遇到的問題在Doctrine 中嘗試左連接時可能出現的常見錯誤正在接收以下語法錯誤:[Syntax Error] lin...
    程式設計 發佈於2024-11-08
  • 使用 Java/ColdFusion/CFML 比較語言檢測程式庫(和 API)
    使用 Java/ColdFusion/CFML 比較語言檢測程式庫(和 API)
    语言检测是我们在过去的项目中需要的一个功能。 我在 2020 年写了一篇关于 Optimaize Language Detector java 库的 kju2 fork 的使用的文章。自 2015 年以来,Optimaize 库就没有更新过,kju2 分支于 2023 年 4 月 16 日被置于只...
    程式設計 發佈於2024-11-08
  • 如何在 CSS 中在背景上建立曲線?
    如何在 CSS 中在背景上建立曲線?
    在背景上創建曲線在網頁開發領域,設計師經常會遇到出於美學目的創建曲線的需要。其中一個場景是將剪切曲線放置在背景頂部,而不是右側。 要實現這一點,需要修改現有的 CSS 程式碼來調整曲線的位置和形狀。操作方法如下:調整偽元素位置:調整偽元素位置:更改偽元素的位置(.box:之前和.box: after...
    程式設計 發佈於2024-11-08
  • 捕捉 Django 應用程式中的錯誤的最佳方法
    捕捉 Django 應用程式中的錯誤的最佳方法
    在 Web 開發的世界中,錯誤是整個過程中不可避免的一部分。但對於 Django(最受歡迎的 Python Web 框架之一)來說,擁有可靠的錯誤捕獲策略可以在流暢的用戶體驗和令人沮喪的用戶體驗之間產生巨大的差異。 作為開發人員,我們經常發現自己不斷地與難以捉摸的錯誤和意外行為作鬥爭。無論您是建立...
    程式設計 發佈於2024-11-08
  • 如何將 GORM 欄位註解整合到 Protobuf 定義中?
    如何將 GORM 欄位註解整合到 Protobuf 定義中?
    將欄位註解整合到Protobuf 定義中尋求在其protobuf 定義中使用GORM 提供的欄位註解的開發人員可能會因註解缺少欄位註解而遇到挑戰Protobuf 3 語法中的本機日期時間類型。 為了解決這個問題,可以使用後處理腳本來使用所需的 GORM 註解來增強產生的原型文件。例如,給定以下 pr...
    程式設計 發佈於2024-11-08
  • 開發人員如何建立即時 Web 應用程式?
    開發人員如何建立即時 Web 應用程式?
    在不断发展的技术世界中,实时 Web 应用程序已成为寻求增强用户参与度和简化沟通的企业的强大解决方案。这些应用程序提供即时更新和交互,使其在消息传递、游戏和电子商务等领域至关重要。对于开发人员,特别是那些在澳大利亚开发人员来说,了解构建实时应用程序的细微差别至关重要。本文将探讨创建实时 Web 应用...
    程式設計 發佈於2024-11-08
  • 使用 SAM 框架建置 Go Serverless REST API 並部署到 AWS (Amazon Linux untime)
    使用 SAM 框架建置 Go Serverless REST API 並部署到 AWS (Amazon Linux untime)
    为什么还要另一个 Go 教程 AWS 最近已弃用多项服务和运行时。正如我们所看到的,随着我们喜爱的 CodeCommit 和其他关键服务的终止,AWS Lambda 函数不再支持 Go1.x。 如果您尝试部署大部分过时的教程,您可能会遇到如下错误: Resource creatio...
    程式設計 發佈於2024-11-08
  • C 中的不相交聯合
    C 中的不相交聯合
    目前还不清楚如何在 C: 中表达此 Haskell 类型 data Tree = Leaf Int | Inner Tree Tree 与 Haskell 和 Rust 等语言不同,C 缺乏对的内置支持 不相交联合。然而,如果我们愿意做一些额外的输入,它确实提供了代表它们所需的所有成分。 首先要认识...
    程式設計 發佈於2024-11-08
  • 社群媒體上的圖文貼文有何作用?
    社群媒體上的圖文貼文有何作用?
    圖形貼文透過提高用戶參與度和強化品牌形像在社群媒體行銷中發揮著至關重要的作用。在 Instagram、LinkedIn 和 Facebook 等快節奏的社交平台中,用戶會滾動瀏覽大量內容,引人注目的視覺效果可以讓您的貼文脫穎而出。圖形快速有效地傳達訊息,使其成為與受眾溝通的強大工具。 ...
    程式設計 發佈於2024-11-08
  • 如何使用 javac、Ant 或 Maven 遞歸編譯多個 Java 檔案?
    如何使用 javac、Ant 或 Maven 遞歸編譯多個 Java 檔案?
    如何使用javac 遞歸編譯所有Java 檔案為每個套件使用單獨的shell 指令編譯分佈在多個套件中的大量Java 檔案可能會很乏味包裹。相反,請考慮使用以下方法之一來簡化編譯。 方法1:使用@source產生一個文字檔案(例如,sources.txt) txt),其中列出了要編譯的所有Java文...
    程式設計 發佈於2024-11-08
  • 如何存取 PHP $_GET 數組中的多值參數?
    如何存取 PHP $_GET 數組中的多值參數?
    在 PHP $_GET 陣列中存取多值參數PHP 的 $_GET 超全域數組允許存取查詢字串參數。預設情況下,當為相同參數指派多個值時,僅最後一個值會儲存在 $_GET 中。但是,可以以數組形式檢索此類值。 建立多值$_GET 參數要為查詢字串中的參數傳送多個值,只需使用方括號表示法:http://...
    程式設計 發佈於2024-11-08
  • 如何使用 Python 在文件的特定位置插入一行?
    如何使用 Python 在文件的特定位置插入一行?
    在Python中的文件中間插入一行在文件中的指定位置插入一行,同時保持文件的完整性現有內容可以使用Python 的檔案處理功能來實現。 要在文件中的索引 x 處插入一行,請按照下列步驟操作:開啟檔案進行讀取。 使用 readlines() 方法將整個文件讀入行列表。 使用 insert() 方法在指...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3