JS學習筆記 深淺拷貝

2021-09-19 05:30:48 字數 1679 閱讀 9038

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 ...