JS 深淺拷貝的區別以及實現方式

2022-06-11 12:00:11 字數 2503 閱讀 8516

在學習js時最讓我頭疼的就是棧和堆以及一切概念性的問題 也是最近才把想給這個搞通提上了日程

簡單來說 深淺拷貝的區別:

a複製了b 當改變 a 中的乙個元素 b 中的這個元素也改變了 這就叫做淺拷貝

反之 改變 a 中的元素 b 中的元素並沒有一起改變 這就叫做 深拷貝  深拷貝都是針對於較為複雜的object型別

這個也就要牽扯到棧和堆 以及 資料型別的概念了

js幾大基本資料型別: null undefined number boolean string object symbol(唯一值) bigint(es10未來 任意精度整數)

引用型別:object類 --- 常規名值對的無序物件 陣列:[1, 2] 函式等

1、基本型別 --- 名值都儲存再棧記憶體中; let a = 1

當 b = a 複製時; 棧記憶體會新開闢乙個記憶體

所以當你修改 a = 2 時 b 的值並不會發生改變  但這也算不上深拷貝 因為深拷貝都是針對於較為複雜的object型別

2、引用型別 名存棧記憶體中 值存堆記憶體中 但是棧記憶體會提供乙個引用位址指向堆記憶體中的值

所以當 a = b 進行拷貝的時候 複製的是 a 的引用位址 而非堆裡面的值

當我們 a [0] = 7 時 由於 a 和 b 指向的都是同乙個堆記憶體值 所以 a 的修改 影響到了 b  這就是所謂的淺拷貝

所以要實現深拷貝 就是要在堆記憶體中新建乙個 b 的堆記憶體

實現深拷貝

function deepclone(obj)

let a = [0, 1, [3,4], 9]

b = deepclone(a)

a[2][0] = 7

console.log(a, b) //[0,1,[7,4],9] [0, 1, [3,4], 9]

json.stringify() 和 json.parse() 的區別

json.stringify() 將物件轉換為 json字串 而 json.parse() 則是將json字串轉換為 物件

但是在使用json.parse()時   所轉換的json字串必須要符合josn格式 即鍵值都需要 "" 進行包裹

let a = '["1","2"]';

let b = "['1','2']";

console.log(json.parse(a));// array [1,2]

console.log(json.parse(b));// 報錯

遞迴方式實現:

陣列放 splice  concat slice 都不是真正的深拷貝 在一級層級是沒問題的 當有二層層級時  就會被影響

JS深淺拷貝的多種實現方式

通過for迴圈遍歷 let obj2 for let key in obj 通過 擴充套件運算子 let obj2 概念 開闢一塊新的記憶體空間,複製要拷貝的資料至新建立的記憶體空間,兩個資料結構的增刪改查互不干擾。使用json的函式 不適用於物件中含有函式 正則 日期 let obj2 json ...

js實現深淺拷貝

一 實現淺拷貝的方法 1 直接用 賦值 let a 0 1,2 3,4 b a console.log a b a 0 1 console.log a,b 兩個相同的 1,1,2,3,4 2 for in只迴圈第一層 只複製第一層的淺拷貝 function copy obj1 for let i i...

深淺拷貝以及深淺拷貝的方法

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...