首先可以通過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...