對於基本型別的資料,深拷貝與淺拷貝都相同,都是開闢一塊新的空間,將陣列賦值存入。舊值的改變不會影響新值,然鵝對於引用型別的資料就不相同了。
對於引用型別的資料實行淺拷貝,當舊值發生改變時,新值也會改變,這是因為淺拷貝僅僅只是在棧中新開闢一塊空間,將舊值存在棧中的指標複製給新值,新舊值指向的是同一塊記憶體。舊值改變時,新值自然也是改變了的。
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]
缺點:不能實現其中函式的拷貝
無法拷貝原型鏈上的屬性和方法
資料層次很深時,會棧溢位
functiondeepclone(obj) ;
for (var key in
obj)
else
}return
newobj;
}var a = [, 1]
var b =deepclone(a);
console.log(b)
functiondeepclone(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...