深拷貝and淺拷貝!

一、什么是拷貝?什么是深拷貝和淺拷貝?

(1)拷貝:拷貝就是為了復用原對象的部分or全部數據,在原對象的基礎上通過復制的方式創建一個新的對象。

拷貝對象可以分為三種類型:直接賦值、淺拷貝和深拷貝

?(2)直接賦值:并不會創建一個新的對象,而是將原對象的引用賦給新變量。因此,修改新變量會影響到原對象。

let obj1 = { name: "Alice", age: 25 };
let obj2 = obj1;obj2.age = 30;
console.log(obj1); // { name: "Alice", age: 30 }
console.log(obj2); // { name: "Alice", age: 30 }

(3)淺拷貝淺拷貝會創建一個新的對象,僅復制對象的第一層屬性。如果是簡單數據類型拷貝值,引用數據類型(eg:對象、數組)拷貝的是地址。?如果是單層對象,沒問題,如果有多層就有問題,修改嵌套對象會影響原對象。

?

(4)深拷貝會創建一個新的對象,并且遞歸地拷貝所有嵌套對象,使得新對象與原對象完全獨立。

????????(深拷貝會開辟新的棧,兩個對象對應兩個不同的地址,修改對象A的屬性,并不會影響到對象B。)

?

二、淺拷貝實現方法

????????淺拷貝會創建一個新的對象,但新對象中的屬性如果是對象,則這些屬性仍然指向原對象中的對應屬性。因此,修改嵌套對象會影響到原對象。

1、Object.assign()?

let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = Object.assign({}, obj1);obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "London" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }

2、使用展開運算符(...)實現?

let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = { ...obj1 };obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "London" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }

三、深拷貝實現方法

????????深拷貝會創建一個新的對象,并且遞歸地拷貝所有嵌套對象,使得新對象與原對象完全獨立。

1、通過遞歸實現深拷貝

如果一個函數在內部可以調用其本身,那么這個函數就是遞歸函數

2、使用?JSON.parse?和?JSON.stringify?實現?

let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = JSON.parse(JSON.stringify(obj1));obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "New York" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }

3、js庫lodash里面cloneDeep內部實現了深拷貝?

import _ from 'lodash';
let obj = { a: 1, b: [2, 3] };
let copy = _.cloneDeep(obj);

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

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

相關文章

高頻面試題(含筆試高頻算法整理)基本總結回顧43

干貨分享,感謝您的閱讀! (暫存篇---后續會刪除,完整版和持續更新見高頻面試題基本總結回顧(含筆試高頻算法整理)) 備注:引用請標注出處,同時存在的問題請在相關博客留言…

《靈珠覺醒:從零到算法金仙的C++修煉》卷三·天劫試煉(34)混元金斗裝萬物 - 0-1背包問題(二維DP)

《靈珠覺醒:從零到算法金仙的C++修煉》卷三天劫試煉(34)混元金斗裝萬物 - 0-1背包問題(二維DP) 哪吒在數據修仙界中繼續他的修煉之旅。這一次,他來到了一片神秘的混元谷,谷中有一座巨大的混元金斗,斗身閃爍著神秘的光芒。谷口有一塊巨大的石碑,上面刻著一行文字:“欲…

網絡爬蟲【簡介】

我叫補三補四,很高興見到大家,歡迎一起學習交流和進步 今天來講一講視圖 一、網絡爬蟲的定義 網絡爬蟲(Web Crawler),又稱為網絡蜘蛛、網絡機器人等,是一種按照一定規則自動抓取互聯網信息的程序或腳本。它…

?AI時代到來,對電商來說是效率躍升,還是溫水煮青蛙

?凌晨三點的義烏商貿城,95后創業者小王,靜靜地盯著屏幕上的AI工具,竟露出了笑容。這個月他的跨境玩具店銷量提升了不少,從之前的狀態翻了3倍;而且團隊人數有所變化,從5人縮減到了2人(其中包括他…

PDF文件密碼保護破解:安全解密的步驟與技巧

PDF文件加密后,需要特定的密碼才能訪問內容。以下是一些常見的方法來解密PDF文件: 方法一:使用Adobe Acrobat 如果你有Adobe Acrobat Pro,可以使用它來解密PDF文件。 打開Adobe Acrobat Pro: 啟動Adobe Acrobat Pro…

qt 自帶虛擬鍵盤的編譯使用記錄

一、windows 下編譯 使用vs 命令窗口,分別執行: qmake CONFIG"lang-en_GB lang-zh_CN" nmake nmake install 如果事先沒有 指定需要使用的輸入法語言就進行過編譯,則需要先 執行 nmake distclean 清理后執行 qmake 才能生效。 …

Java開發之數據庫應用:記一次醫療系統數據庫遷移引發的異常:從MySQL到PostgreSQL的“dual“表陷阱與突圍之路

記一次醫療系統數據庫遷移引發的異常:從MySQL到PostgreSQL的"dual"表陷阱與突圍之路 一、驚魂時刻:數據庫切換引發的系統雪崩 某醫療影像系統在進行國產化改造過程中,將原MySQL數據庫遷移至PostgreSQL。遷移完成后,系…

C++刷題(二):棧 + 隊列

📝前言說明: 本專欄主要記錄本人的基礎算法學習以及刷題記錄,使用語言為C。 每道題我會給出LeetCode上的題號(如果有題號),題目,以及最后通過的代碼。沒有題號的題目大多來自牛客網。對于題目的…

精通游戲測試筆記(持續更新)

第一章、游戲測試的兩條規則 不要恐慌 不要將這次發布當作最后一次發布 不要相信任何人 把每次發布當作最后一次發布 第二章:成為一名游戲測試工程師

Windows功能之FTP服務器搭建

一、創作背景 之前有用linux系統搭建過ftp服務器,最近想著用windows系統也順便搭建一個,看網上有第三方服務軟件一鍵部署,記得windows可以不借助第三方軟件就可以搭建,就想順便操作試試,結果老是連接不上,費…

星型組網模塊的兩種交互方式優缺點解析

星型組網模塊簡介 星型組網模塊工作在433MHz頻段;星型組網模塊集主機(協調器)、終端為一體,星型組網模塊具有長距離、高速率兩種傳輸模式,一個主機(協調器)支持多達200個節點與其通訊&#xff0…

二分+前綴和——森林的最大美麗值

森林的最大美麗值(二分差分數組) 題目分析 求最小值的最大值,聯想到二分。 第一階段二段性分析 對于所有樹的高度都可以大于等于mid,那么我們可以確定高度小于mid的值一定也可以,但是此時我需要找的是最大的高度,那么mid一定比…

Pytorch實現之最小二乘梯度歸一化設計

簡介 簡介:LSGAN提出了一種利用最小二乘法來計算兩個數據分布之間的距離,該論文在此基礎上采用梯度歸一化來進一步穩定訓練。 論文題目:LSN-GAN: A Novel Least Square Gradient Normalization for Generative Adversarial Networks(LSN-GAN:一種新的生成對抗網絡的最小…

JavaScript基礎-全局作用域

在JavaScript編程中,理解變量的作用域是編寫高效、可維護代碼的關鍵之一。全局作用域是指變量在整個程序范圍內都可訪問的狀態,這意味著它們可以在任何函數或代碼塊中被讀取和修改。然而,過度使用全局變量也可能導致一些問題,如命…

【2025.3.13】記一次雙系統筆記本加裝固態硬盤記錄 linux擴容 linux更換/home和/opt所在硬盤 windows無法調整亮度

文章目錄 🌕事情經過🌕更換/home和/opt的掛載硬盤🌙目的🌙初始化1t固態硬盤🌙打開Linux查看硬盤信息🌙給新1t固態硬盤分區🌙格式化分區🌙把新1t固態硬盤先掛載到/mnt/ssd_1t 用于后續…

山東省新一代信息技術創新應用大賽-計算機網絡管理賽項(樣題)

目錄 競賽試題 網絡拓撲 配置需求 虛擬局域網 IPv4地址部署 OSPF及路由部署 配置合適的靜態路由組網 MSTP及VRRP鏈路聚合部署 IPSEC部署 路由選路部署 設備與網絡管理部署 1.R1 2.R2 3.S1 4.S2 5.S3 競賽試題 本競賽使用HCL(華三云實驗室)來進行網絡設備選擇…

【測試語言基礎篇】Python基礎之List列表

一、Python 列表(List) 序列是Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。 Python有6個序列的內置類型,但最常見的是列表和元組。序列都可…

大數據面試之路 (二) hive小文件合并優化方法

大量小文件容易在文件存儲端造成瓶頸,影響處理效率。對此,您可以通過合并Map和Reduce的結果文件來處理。 一、合并小文件的常見場景 寫入時產生小文件:Reduce任務過多或數據量過小,導致每個任務輸出一個小文件。 動態分區插入&…

MySQL 批量插入 vs 逐條插

MySQL 插入數據:批量插入 vs 逐條插入,哪個更快? 在 MySQL 中,插入數據有兩種常見方式: 批量插入:一條 SQL 插入多條數據。逐條插入:每次插入一條數據。 這兩種方式有什么區別?哪…

Docker基礎命令說明

Docker基礎操作命令眾多,這些命令可以按如下方式進行分類: 鏡像操作容器操作網絡操作數據卷操作LOG查詢 等方面進行分類。 一、鏡像操作命令 docker images:用于列出本地系統中所有的 Docker 鏡像。鏡像就像是一個模板,它包含…