深拷貝與淺拷貝

2021-09-23 11:28:56 字數 1739 閱讀 6576

當複製引用型別的值時,其實就是把變數的值複製乙份放在新的變數空間中,但複製的並不是變數本身,而是指向物件的指標,所以在複製引用型別時,改變其中乙個會影響另外乙個。

深拷貝與淺拷貝其實就是為了解決引用型別的複製操作會使得兩個物件共用乙個引用的問題

本文圍繞物件obj的複製、深拷貝、淺拷貝的問題展開討論

var obj=

}

如果只是簡單的採用var newobj=obj進行物件的複製操作,此時如果修改newobj中的屬性,就會使得舊物件obj的相應屬性也被修改(如果做如下修改:newobj.age=25),得到的結果將會是:

當要複製的物件的所有屬性都不是引用型別時就可以利用淺拷貝實現

淺拷貝的實現方法如下:

(1) 遍歷,返回新物件

function shallowcopy(obj);

if(typeof obj!="object")else

}return newobj;

}

通過對obj淺複製,此時,如果我們修改newobj.age=20後,同時觀察newobj與obj兩個物件,我們發現,此時對newobj中age屬性的修改並沒有影響到obj中的age屬性。

但是,當我們對newobj物件中pre的one屬性進行修改時:var newobj.pre.one=」student」,此時觀察newobj物件與obj物件,我們發現,由於pre屬性是乙個子物件,此時對屬性pre中的one屬性進行修改時,會對obj物件中的子物件有影響。

其實,淺拷貝複製的是所有引用型別的指標,而不是具體的值,所以淺拷貝可以解決常見的現象,但是如果物件中還有子物件,則用淺拷貝不夠徹底。

深拷貝可以徹底的拷貝乙個物件

深拷貝的實現方法如下:

(1) 遞迴(如果物件的屬性是乙個子物件,則進行遞迴遍歷複製,直到遍歷完所有的屬性)

//遞迴實現深拷貝

function deepcopy(obj)

if(obj instanceof array)else;

}for(var k in obj)else

}return newobj;

}

(2) json的正反序列化(先將乙個物件序列化為json字串,再將json字串解析為物件)

我們採用遞迴的方式實現物件obj的深拷貝,觀察如下的結果:

修改newobj.age=20,同時觀察newobj與obj兩個物件,我們發現,此時對newobj中age屬性的修改並沒有影響到obj中的age屬性。

修改newobj物件中pre的one:var newobj.pre.one=」worker」,此時觀察newobj物件與obj物件,我們發現,此時對newobj中pre的one屬性的修改並沒有影響到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...