深拷貝與淺拷貝

2022-07-17 02:39:10 字數 2214 閱讀 7533

引子

什麼是淺拷貝?什麼是深拷貝?淺顯易懂的說:假設b複製了a,如果b發生變化,a也隨之變化,那麼說明為淺拷貝;若b發生變化,並不會導致a也發生變化,則稱之為深拷貝。

舉個例子:

不禁疑惑,陣列b複製了陣列a,明明只修改了陣列b,為什麼陣列a也隨著改變呢?

此時需要引入基本資料型別和引用資料型別的概念

基本資料和引用資料

基本資料型別有哪些?

null,undefined,number,string,boolean,symbol

引用資料型別?

有常規名值對的無序物件,還有陣列[1,2,3]和以及函式

有了解過基本資料型別和引用資料型別的儲存方式嗎?

實現深拷貝

遞迴實現深拷貝

//

只適用於物件和陣列的深拷貝

function

deepclone(targetobj)

//如果目標物件為引用型別

借用json物件的parse和stringify

function

deepclone(obj)

let obj = }

let copy =deepclone(obj)

copy['name'] = 'john'copy.son.name = 'tom'console.log(obj,copy)

某些api所實現的深淺拷貝

array.prototype.concat()實現陣列的不完全深拷貝

array.prototype.slice()實現陣列不完全深拷貝

只能實現第一層屬性的深拷貝,原因在於,方法返回乙個新的陣列物件

object.assign()實現的不完全深拷貝

let obj = }

let copy = object.assign({}, obj)//

因為方法返回目標物件{},實現了第一層的深拷貝

copy['name'] = 'john'copy.son.name = 'son'//

第二層為淺拷貝了,所以修改copy物件時,obj物件的第二層也改變了

深拷貝的實用性

後台返回一堆資料時,在多人開發中,我們不知道資料是否有其他的開發需求,因此我們不能直接修改資料,深拷貝可以使我們安心操作拷貝的資料,而無需擔心修改原資料帶來的隱性問題。

「淺拷貝」與「深拷貝」

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

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

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