淺拷貝與深拷貝

2022-06-05 22:45:13 字數 1941 閱讀 2123

淺拷貝

淺拷貝就是建立乙個新的物件,用來接受要複製和引用的值,如果要拷貝的值為數字,則進行賦值運算,如果是引用物件,則將拷貝的物件路徑分享給新的物件

而使用物件路徑的話,其實就是引用了它得屬性,值會跟著拷貝物件改變,這就是淺拷貝。

淺拷貝的方法:

1.object.assign()

這個方法是es6中object的方法,使用簡單

object.assign()方法用於將所有可列舉屬性的值從乙個或多個源物件分配到目標物件。然後返回目標物件。

注意:使用 object.assign 方法有幾點需要注意:

它不會拷貝物件的繼承屬性;

它不會拷貝物件的不可列舉的屬性;

可以拷貝 symbol 型別的屬性。

2.擴充套件運算子

擴充套件運算子的語法為:let cloneobj = ;

/* 物件的拷貝 */

let obj = }

let obj2 =

obj.a = 2

console.log(obj) //} console.log(obj2); //}

obj.b.c = 2

console.log(obj) //} console.log(obj2); //}

/* 陣列的拷貝 */

let arr = [1, 2, 3];

let newarr = [...arr]; //跟arr.slice()是一樣的效果

擴充套件運算子 和 object.assign 有同樣的缺陷,也就是實現的淺拷貝的功能差不多,但是如果屬性都是基本型別的值,使用擴充套件運算子進行淺拷貝會更加方便。

3.concat

還可以使用concat進行陣列淺拷貝,注意concat只能用於陣列的拷貝,比較有1侷限性

使用方法如上。

4.slice陣列擷取

slice是乙個用於陣列擷取的方法,slice(begin,end),這個方法與concat方法一樣,只能用於陣列

深拷貝學習了淺拷貝了之後發現,淺拷貝只能拷貝物件中的值,和一層屬性,如果要拷貝完全的內容就要用到深拷貝

1.json.stringfy()

這個方法就是將乙個物件轉為json資料,在轉換為string資料,適用方法如:

這個方法實現起來很簡單就可以實現深拷貝,

但是使用 json.stringfy 實現深拷貝還是有一些地方值得注意,我總結下來主要有這幾點:

拷貝的物件的值中如果有函式、undefined、symbol 這幾種型別,經過 json.stringify 序列化之後的字串中這個鍵值對會消失;

拷貝 date 引用型別會變成字串;

無法拷貝不可列舉的屬性;

無法拷貝物件的原型鏈;

拷貝 regexp 引用型別會變成空物件;

物件中含有 nan、infinity 以及 -infinity,json 序列化的結果會變成 null;

無法拷貝物件的迴圈應用,即物件成環 (obj[key] = 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...