深拷貝與淺拷貝

2022-07-29 11:06:09 字數 1193 閱讀 1700

對於基本型別的資料,深拷貝與淺拷貝都相同,都是開闢一塊新的空間,將陣列賦值存入。舊值的改變不會影響新值,然鵝對於引用型別的資料就不相同了。

對於引用型別的資料實行淺拷貝,當舊值發生改變時,新值也會改變,這是因為淺拷貝僅僅只是在棧中新開闢一塊空間,將舊值存在棧中的指標複製給新值,新舊值指向的是同一塊記憶體。舊值改變時,新值自然也是改變了的。

var a = [1

];var b =a;

a[0] = 2

;console.log(b);

//[2]

只能實現簡單資料型別的深拷貝

var a = 

var b =

而在新拷貝中,對於引用型別的拷貝是在堆中新開闢一塊空間,將舊的數值複製該這個空間,再在棧中開闢一塊空間指向堆中這個位址。新舊值已不再相互影響.

var a = [1, 2, 3

];var b =json.parse(json.stringify(a));

a[1] = 1

;console.log(b);

//[1, 2, 3]

缺點:不能實現其中函式的拷貝

無法拷貝原型鏈上的屬性和方法

資料層次很深時,會棧溢位

function

deepclone(obj) ;

for (var key in

obj)

else

}return

newobj;

}var a = [, 1]

var b =deepclone(a);

console.log(b)

function

deepclone(obj) )

return

copy;

}var a = [, 1]

var b =deepclone(a);

console.log(b)

陣列的slice()方法並不能實現深拷貝

var a = [1, [1, 2], 3];

var b =a.slice();

a[0] = 2;

console.log(b); // [1, [1, 2], 3]

a[1][1] = 1; console.log(b); // [1, [1, 1], 3]

「淺拷貝」與「深拷貝」

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...