let a =
let b = object.assign({}, a)
a.age = 2
console.log(b.age) // 1
2、展開運算子...
let a =
let b =
a.age = 2
console.log(b.age) // 1
淺拷貝只解決了第一層的問題,如果接下去的值中還有物件的話,兩者享有相同的位址,改變某一物件的值還是會相互影響。要解決這個問題,我們就得使用深拷貝了。
1、通過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 和 symbol
let a = ,
name: 'yck'
}let b = json.parse(json.stringify(a))
console.log(b) //
2、如果所需拷貝的物件含有內建型別並且不包含函式,可以使用messagechannel
function structuralclone(obj) = new messagechannel()
port2.onmessage = ev => resolve(ev.data)
port1.postmessage(obj)
})}var obj =
}obj.b.d = obj.b
// 注意該方法是非同步的
// 可以處理 undefined 和迴圈引用物件
const test = async () =>
test()
3、自己實現乙個簡易版深拷貝
function deepclone(obj)
if (!isobject(obj))
let isarray = array.isarray(obj)
let newobj = isarray ? [...obj] :
reflect.ownkeys(newobj).foreach(key => )
return newobj
}let obj =
}let newobj = deepclone(obj)
newobj.b.c = 1
console.log(obj.b.c) // 2
JS深 淺拷貝
在js中,資料型別分為基本資料型別和引用資料型別兩種。對於基本資料型別來說,它的值直接儲存在棧記憶體中,而對於引用型別來說,它在棧記憶體中只是儲存了乙個指向對記憶體的引用,而真正的資料儲存在堆記憶體中。object array 這兩個就是引用型別,當我門直接去拷貝的話 copyobj obj 拷貝的...
js 深淺拷貝
深拷貝就是複製內部內容 淺拷貝就是複製記憶體位址 var obj 淺拷貝 引用傳遞 淺拷貝就是賦值,將鑰匙複製乙份 var o obj 深拷貝 內部內容複製乙份 將房子複製乙份 方法一 var str json stringify obj var obj3 json parse str 方法二 va...
js深淺拷貝
1.什麼是深淺拷貝 簡單的來說,加入b複製a a改變 如果b也跟著改變的話,那就是淺拷貝,反之是深拷貝 實現淺拷貝方法 1.賦值操作 var a 0 1,2 3,4 var b a a 0 5console log a 5,1,2,3,4 console log b 5,1,2,3,4 2.es6 ...