淺拷貝與深拷貝

2021-09-23 14:02:19 字數 585 閱讀 6672

淺拷貝:只是針對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間,例如b複製了a,當修改a時,b也跟著變了,這就是淺拷貝。

深拷貝:不但對指標進行拷貝,而且對指標的內容進行拷貝,經深拷貝之後的指標是指向兩個不同位址的指標,例如b複製了a,當修改a時,b沒變,這就是深拷貝。

注意:對於js的基本型別(number,string,boolean,null,undfined,symbol)和引用型別兩種變數型別,基本型別在記憶體中屬於棧記憶體,而引用型別在記憶體中的儲存方式是堆記憶體。基本型別複製時,相當於把值也一併複製給了新的變數,改變原值,並不會影響新值;引用型別複製時,實際上只是複製了指向堆記憶體的位址,即原來的變數和複製的新變數指向了同乙個東西,那麼改變原來的值,新值也會改變。

實現深拷貝的方法:

1、深拷貝,是拷貝物件各個層級的屬性,即實現深拷貝的方法就是,遞迴的去複製所有層級屬性。比如陣列的slice(0),concat()方法都是只拷貝了一級屬性,二級屬性或者更深層次的屬性都不會拷貝,所以這些都不是真正的深拷貝,而extend()方法才是真正的深拷貝。

2、var objclone = json.parse(json.stringify(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...