深拷貝 淺拷貝理解及應用

2021-10-09 12:25:11 字數 2279 閱讀 4231

js的原始值、引用值

拷貝針對的是引用型別物件,例如object、array等

簡單來說就是淺拷貝是只是複製物件的引用,值還是共享一塊記憶體,原值和複製物件值會相互影響。

深拷貝,是徹底的賦值物件的值,而不是物件的引用,彼此間不會相互影響(相當於重新創造乙個值,類似於原始值的操作)。

賦值的時候一定要注意是堆的賦值還是變數的賦值,如果是在函式內定義的新物件,要注意每呼叫一次函式,裡面的物件都是乙個新值都會重新指向乙個新的記憶體。

(對第一層的資料進行了拷貝處理,再深一點的層級修改仍然會影響到資料)

1、object.assign()

let demo =

}let clone_demo = object.

assign

(, demo)

demo.name = 『yanyan』

demo.con.aa = 『aaa』

console.

log(clone_demo.name,clone_demo.con.aa)

// yanyan you

2、展開運算子…
let demo =

}let clone_demo =

demo.name = 『yanyan』

console.

log(clone_demo.name)

// yanyan

3、函式實現
function

******clone

(initalobj)

;// 重新的乙個堆位址

for(

var i in initalobj)

return obj;

}

(僅初次完全複製內容)

使用json.parse、json.stringify實現陣列的拷貝

deepclone

(obj)

,let demo =

}let clone_demo =

deepclone

(demo)

demo.name = 『yanyan』

console.

log(clone_demo.name)

// yan 不會修改拷貝後的值

注意:會忽略undefined symbol

不能序列化函式

如果資料有null會考成空物件

不能解決迴圈引用的物件

不能正確處理 new

date()

不能處理正則

遞迴實現
//使用遞迴的方式實現陣列、物件的深拷貝

function

deepclone1

(obj)

;//進行深拷貝的不能為空,並且是物件

if(obj &&

typeof obj ===

"object")}

}return objclone;

}

第二種深拷貝
// 保留陣列 並且判斷是不是null 

letisobject

= obj =>

typeof obj ===

'object'

&& obj !==

null

;let

shallowclone2

= source =>

for(

let key in source)

}return target

}let demo =

, h1 :

null

, h2 :[1

,2,3

], h3 : undefined }

let clone_demo =

shallowclone2

(demo)

; console.

log(clone_demo)

; demo.name = 'new

name』

demo.book.price = '100』

demo.h2[1]

= 'new

data』

console.

log(clone_demo.name,clone_demo.book.price)

// dayday 45

console.

log(clone_demo)

;// 修改demo值為能影響clone_demo

對深拷貝及淺拷貝的理解

1.兩個拷貝之間區別主要是用於物件資料之間的拷貝!2.區別 沒指標 深拷貝和淺拷貝沒什麼區別 有指標 淺拷貝 即物件的預設拷貝函式,只是將指標的位址拷貝給物件,兩個變數同時指向乙個位址,這樣在析構的時候必然會導致程式崩潰 class a a protected private char m data...

淺拷貝,深拷貝的理解

淺拷貝 淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層 深拷貝 深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝 淺拷貝 操作 簡單...

理解「淺拷貝」和「深拷貝」

淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...