淺拷貝,深拷貝的理解

2021-10-12 08:43:36 字數 2009 閱讀 7698

淺拷貝:淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層

深拷貝:深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝

淺拷貝**操作:

簡單的object.assign()拷貝方法:

拷貝方法

//拷貝

a =; b = object.

assign

(,a)

; b.name =

"李四"

;//拷貝完之後進行改變屬性,測試拷貝的屬性值改變原資料是否改變。

console.

log(a,b)

;//輸出:

(拷貝成功)

//拷貝[ ]

a =["1"

,"2"

,"3"];

b = object.

assign([

],a)

; b[1]

="hello"

; console.

log(a,b)

//輸出:["1","2","3"]

["1"

,"hello"

,"3"

](拷貝成功)

//for in拷貝方法

varcopy

=function

(a)}

return res;

}

a =};

b =copy

(a);

b.people.name=

"hello"

; a =

["a"

,"b"

,"c"

];b =

copy

(a);

b[1]

=0;//拷貝完之後進行改變屬性,測試拷貝的屬性值改變原資料是否改變。

console.

log(a,b)

//輸出:["a","b","c"]

["a"

,"0"

,"c"

](拷貝成功)

深拷貝(完美拷貝):

① 如果是基本資料型別,直接返回;

② 如果是regexp或者data型別,返回對應型別;

③ 如果是複雜資料型別,遞迴;

④ 考慮迴圈引用的問題。

function

deepclone

(obj,hash =

newweakmap()

)if(hash.

has(obj)

)//如果obj是陣列,那麼 obj.constructor 是 [function: array]

//如果obj是物件,那麼 obj.constructor 是 [function: object]

let t =

newobj.constructor()

; hash.

set(obj,t)

;for

(let key in obj)

}return t;

}var show =

, age:

null

, pic:undefined,

}var show2 =

deepclone

(show)

;show2.name=

"mary"

console.

log(show,show2)

//拷貝成功,完美拷貝

淺拷貝和深拷貝的區別:

淺拷貝只能複製物件或陣列的第一層屬性,而深拷貝是拷貝多層,每一級的資料都會被拷貝出來。

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

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

淺拷貝 深拷貝的再次理解

以前對淺拷貝的認識不夠,認為只是對指標的賦值,沒有真實的開闢空間。看了一篇部落格後感覺自己的認識還不夠,其實淺拷貝還會導致記憶體洩漏!對,你沒看錯,確實是 記憶體洩漏!最後會把部落格鏈結貼出來。我們以前對淺拷貝深拷貝的理解是這樣的 淺拷貝是對指標的拷貝,拷貝以後兩個指標指向的是同一塊記憶體空間,深拷...

深拷貝和淺拷貝的理解

為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...