深拷貝 淺拷貝

2021-08-29 02:34:43 字數 1745 閱讀 5450

首先可以通過object.assign來解決這個問題。

let a = 

let b = object.assign({}, a)

a.age = 2

console.log(b.age) // 1

當然我們也可以通過展開運算子(…)來解決

let a = 

let b =

a.age = 2

console.log(b.age) // 1

通常淺拷貝就能解決大部分問題了,但是當我們遇到如下情況就需要使用到深拷貝了

let a = 

}let b =

a.jobs.first = 'native'

console.log(b.jobs.first) // native

淺拷貝只解決了第一層的問題,如果接下去的值中還有物件的話,那麼就又回到剛開始的話題了,兩者享有相同的引用。要解決這個問題,我們需要引入深拷貝。

這個問題通常可以通過json.parse(json.stringify(object))來解決。

let a = 

}let b = json.parse(json.stringify(a))

a.jobs.first = 'native'

console.log(b.jobs.first) // fe

但是該方法也是有侷限性的:

let obj = ,

}obj.c = obj.b

obj.e = obj.a

obj.b.c = obj.c

obj.b.d = obj.b

obj.b.e = obj.b.c

let newobj = json.parse(json.stringify(obj))

console.log(newobj)

在遇到函式或者undefined的時候,該物件也不能正常的序列化

let a = ,

name: 'yck'

}let b = json.parse(json.stringify(a))

console.log(b) //

你會發現在上述情況中,該方法會忽略掉函式和undefined

但是在通常情況下,複雜資料都是可以序列化的,所以這個函式可以解決大部分問題,並且該函式是內建函式中處理深拷貝效能最快的。當然如果你的資料中含有以上三種情況下,可以使用 lodash 的深拷貝函式。

如果你所需拷貝的物件含有內建型別並且不包含函式,可以使用messagechannel

function structuralclone(obj)  = new messagechannel();

port2.onmessage = ev => resolve(ev.data);

port1.postmessage(obj);

});}var obj = }

// 注意該方法是非同步的

// 可以處理 undefined 和迴圈引用物件

const clone = await structuralclone(obj);

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...

深拷貝 淺拷貝

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝 深拷貝

retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,re...