使用JavaScript實現深淺拷貝

1. 拷貝的基本概念和必要性

在 JavaScript 中,數據類型分為基本數據類型(如?NumberStringBooleanNullUndefinedSymbol)和引用數據類型(如?ObjectArray)。基本數據類型存儲的是值本身,而引用數據類型存儲的是內存地址。當需要對數據進行操作且不想影響原始數據時,就需要進行拷貝。

2. 淺拷貝(Shallow Copy)

概念

淺拷貝創建一個新對象,新對象的頂層屬性是原始對象屬性的副本,但如果原始對象的屬性是引用類型,新對象和原始對象會共享這些引用類型屬性的內存地址。也就是說,修改新對象中引用類型的屬性會影響原始對象中對應的屬性。

實現方式
  • 擴展運算符(Spread Operator):常用于數組和對象的淺拷貝。
// 數組淺拷貝
const originalArray = [1, [2, 3]];
const shallowCopiedArray = [...originalArray];
shallowCopiedArray[1][0] = 9;
console.log(originalArray); // 輸出: [1, [9, 3]]// 對象淺拷貝
const originalObject = { a: 1, b: { c: 2 } };
const shallowCopiedObject = { ...originalObject };
shallowCopiedObject.b.c = 9;
console.log(originalObject.b.c); // 輸出: 9
  • Object.assign():用于將一個或多個源對象的所有可枚舉屬性復制到目標對象。
const original = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, original);
shallowCopy.b.c = 9;
console.log(original.b.c); // 輸出: 9
  • Array.prototype.slice():常用于數組的淺拷貝。
const arr = [1, [2, 3]];
const newArr = arr.slice();
newArr[1][0] = 9;
console.log(arr); // 輸出: [1, [9, 3]]

3. 深拷貝(Deep Copy)

概念

深拷貝會遞歸地復制對象及其所有嵌套的屬性,創建一個完全獨立的新對象,新對象和原始對象在內存中沒有任何共享部分。修改新對象的任何屬性都不會影響原始對象。

實現方式
  • JSON.parse(JSON.stringify()):這是一種簡單的深拷貝方法,但有局限性。它不能處理函數、Symbol?類型的屬性、Date?對象、RegExp?對象等。
const original = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.b.c = 9;
console.log(original.b.c); // 輸出: 2
  • 遞歸實現:自定義函數遞歸地復制對象和數組。
function deepClone(obj) {if (typeof obj !== 'object' || obj === null) {return obj;}let clone;if (Array.isArray(obj)) {clone = [];for (let i = 0; i < obj.length; i++) {clone[i] = deepClone(obj[i]);}} else {clone = {};for (let key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key]);}}}return clone;
}const original = { a: 1, b: { c: 2 } };
const deepCopy = deepClone(original);
deepCopy.b.c = 9;
console.log(original.b.c); // 輸出: 2

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

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

相關文章

解析瀏覽器中JavaScript與Native交互原理:以WebGPU為例

引言 隨著Web應用復雜度的提升&#xff0c;開發者對瀏覽器訪問本地硬件能力的需求日益增長。然而&#xff0c;瀏覽器必須在開放性與安全性之間找到平衡——既不能放任JavaScript&#xff08;JS&#xff09;隨意操作系統資源&#xff0c;又要為高性能計算、圖形渲染等場景提供支…

T-Sql 打印所有用戶表的建表腳本

-- 聲明一個變量用于存儲表名 DECLARE TableName NVARCHAR(128); -- 聲明一個游標&#xff0c;用于遍歷所有用戶表 DECLARE TableCursor CURSOR FOR SELECT name FROM sys.tables WHERE type U; -- 打開游標 OPEN TableCursor; -- 從游標中獲取第一行數據 FETCH NEXT FROM Ta…

25/2/16 <算法筆記> MiDas原理

MiDaS&#xff08;Monocular Depth Sensing&#xff09;是一種基于單目深度估計的技術&#xff0c;它通過深度學習方法使用單張RGB圖像&#xff08;普通2D圖像&#xff09;來估算場景的深度圖&#xff08;Depth Map&#xff09;。相比于傳統的依賴專用深度傳感器&#xff08;如…

python+halcon 解讀labelme標注生成marksimage

這一段代碼封裝了一個類&#xff0c;需要傳統一個圖片和標注后json文件所在的地址&#xff0c;標注的選項是polygon&#xff0c;主要是用于unet深度學習網絡 在初始化時需要輸入文件&#xff08;imagejeson&#xff09;路徑&#xff0c;多分類任務的label_list。會在項目目錄下…

從技術債務到架構升級,滴滴國際化外賣的變革

背 景 商家營銷簡述 在外賣平臺的運營中&#xff0c;我們致力于通過靈活的補貼策略激勵商家&#xff0c;與商家共同打造良好的合作關系&#xff0c;也會提供多樣化的營銷活動&#xff0c;幫助商家吸引更多用戶下單。通過這些活動&#xff0c;不僅能夠提高商家的銷量&#xff0c…

英語—四級CET4考試—技巧篇—選詞填空—實操教學—2014 年 6 月大學英語四級考試真題(第 2 套)

&#x1f3e0;個人主頁&#xff1a;fo安方的博客? &#x1f482;個人簡歷&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大學MBA在讀&#xff0c;也考取過HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等證書。&#x1f433; &…

線性代數中的正交和標準正交向量

在線性代數中&#xff0c;理解正交向量和正交向量至關重要&#xff0c;尤其是對于機器學習中的應用。這篇博文將簡化這些概念&#xff0c;而不會太深入地深入研究復雜的數學。 正交向量 如果兩個向量的點積等于零&#xff0c;則認為這兩個向量是正交的。但點積到底是什么呢&am…

企業文件共享中的權限管理與安全風險防范

在企業的日常運營中&#xff0c;文件共享是必不可少的一項工作。然而&#xff0c;文件共享過程中如果權限管理不當&#xff0c;極易引發安全風險&#xff0c;導致企業敏感信息泄露。因此&#xff0c;加強文件共享中的權限管理與安全風險防范&#xff0c;對于保障企業信息安全至…

急停信號的含義

前言&#xff1a; 大家好&#xff0c;我是上位機馬工&#xff0c;碩士畢業4年年入40萬&#xff0c;目前在一家自動化公司擔任軟件經理&#xff0c;從事C#上位機軟件開發8年以上&#xff01;我們在開發C#的運動控制程序的時候&#xff0c;一個必要的步驟就是確認設備按鈕的急停…

數據結構:圖;鄰接矩陣和鄰接表

鄰接矩陣&#xff1a; 1.概念&#xff1a; 鄰接矩陣是圖的存儲結構之一&#xff0c;通過二維數組表示頂點間的連接關系。 2.具體例子 &#xff1a; 一.無向圖鄰接矩陣示例&#xff1a; 示例圖&#xff08;頂點&#xff1a;A、B、C&#xff0c;邊&#xff1a;A-B、B-C&…

Kubernetes-master 組件

以下是Kubernetes Master Machine的組件。 etcd 它存儲集群中每個節點可以使用的配置信息。它是一個高可用性鍵值存儲&#xff0c;可以在多個節點之間分布。只有Kubernetes API服務器可以訪問它&#xff0c;因為它可能具有一些敏感信息。這是一個分布式鍵值存儲&#xff0c;所…

【第2章:神經網絡基礎與實現——2.1 前饋神經網絡的結構與工作原理】

老鐵們好!今天我們要來一場長達兩萬字的超詳細技術探險,我會像拆解樂高積木一樣把前饋神經網絡(Feedforward Neural Network)的每個零件擺在臺面上,用最接地氣的方式讓你徹底搞懂這個深度學習基石的工作原理。準備好了嗎?我們開始吧! 第一章:神經網絡的 “樂高積木” 1…

【云安全】云原生- K8S kubeconfig 文件泄露

什么是 kubeconfig 文件&#xff1f; kubeconfig 文件是 Kubernetes 的配置文件&#xff0c;用于存儲集群的訪問憑證、API Server 的地址和認證信息&#xff0c;允許用戶和 kubectl 等工具與 Kubernetes 集群進行交互。它通常包含多個集群的配置&#xff0c;支持通過上下文&am…

【環境安裝】重裝Docker-26.0.2版本

【機器背景說明】Linux-Centos7&#xff1b;已有低版本的Docker 【目標環境說明】 卸載已有Docker&#xff0c;用docker-26.0.2.tgz安裝包安裝 1.Docker包下載 下載地址&#xff1a;Index of linux/static/stable/x86_64/ 2.卸載已有的Docker 卸載之前首先停掉服務 sudo…

字節跳動后端二面

&#x1f4cd;1. 數據庫的事務性質&#xff0c;InnoDB是如何實現的&#xff1f; 數據庫事務具有ACID特性&#xff0c;即原子性、一致性、隔離性和持久性。InnoDB通過以下機制實現這些特性&#xff1a; &#x1f680; 實現細節&#xff1a; 原子性&#xff1a;通過undo log實…

SpringBoot中使用MyBatis-Plus詳細介紹

目錄 一、MyBatis-Plus的使用步驟 1.引入MybatisPlus的起步依賴 2.定義Mapper&#xff08;也叫dao&#xff09;層的接口 3.MyBatis-Plus中常用注解 4. 使用MyBatis-Plus時要做如下配置 5.條件構造器 Wrapper 一、MyBatis-Plus的使用步驟 1.引入MybatisPlus的起步依賴 M…

vue3讀取webrtc-stream 視頻流

一.首先下載webrtc-stream&#xff0c;方便自己本地搭建視頻流服務 https://download.csdn.net/download/cyw8998/90373521 解壓后&#xff0c;啟動命令 webrtc-streamer.exe -H 127.0.0.1:8020 二.vue3代碼如下 <template><h1>video</h1><video id&…

vue3搭建實戰項目筆記二

vue3搭建實戰項目筆記二 2.1.git管理項目2.2.隱藏tabBar欄2.2.1 方案一&#xff1a;在路由元信息中設置一個參數是否顯示tabBar2.2.2 方案二&#xff1a;通過全局設置相對定位樣式 2.3.項目里封裝axios2.3.1 發送網絡請求的兩種做法2.3.2 封裝axios并發送網絡請求2.3.2.1 對axi…

USC 安防平臺之移動偵測

隨著第四次科技革命的開啟&#xff0c;AI技術獲取了突飛猛進的發展&#xff0c;視頻監控對應的視頻分析技術也獲取了巨大的發展。 還記得15年前采用人工提取特征做前景背景分離和提取&#xff0c;大部分依賴CPU&#xff0c;最多使用一下TI的DM642 DSP加速&#xff0c;開發難度…

Unity CommandBuffer繪制粒子系統網格顯示

CommandBuffer是 Unity 提供的一種在渲染流程中插入自定義渲染命令的機制。在渲染粒子系統時&#xff0c;常規的渲染流程可能無法滿足特定的渲染需求&#xff0c;而CommandBuffer允許開發者靈活地設置渲染參數、控制渲染順序以及執行自定義的繪制操作。通過它&#xff0c;可以精…