深拷貝 淺拷貝

2022-08-22 00:18:10 字數 1661 閱讀 1756

1、區別

淺拷貝:只拷貝了基本資料型別,引用資料型別只複製了引用,沒有複製實體。

深拷貝:拷貝所有的層級屬性

2、淺拷貝

(1) 直接賦值

拷貝之後,所有層級屬性仍然公用了位址,會被影響

var a = [0, 1, [2,3], 4],

b =a;

a[0] = 1;

a[2][0] = 1;

console.log(a);

//[1,1,[1,3],4]

console.log(b); //

[1,1,[1,3],4]

(2) slice 返回指定元素

第一層的屬性確實深拷貝,擁有了獨立的記憶體,但更深的屬性卻仍然公用了位址

var a = [0, 1, [2,3], 4],

b =a.slice();

a[0] = 1;

a[2][0] = 1;

console.log(a);

//[1,1,[1,3],4]

console.log(b); //

[0,1,[1,3],4]

(3) contact 連線2個和多個陣列

第一層的屬性確實深拷貝,擁有了獨立的記憶體,但更深的屬性卻仍然公用了位址

var a = [0, 1, [2,3], 4],

var b = a.concat(4,5);

a[0] = 1;

a[2][0] = 1;

console.log(a);

//[1,1,[1,3],4]

console.log(b); //

[0,1,[1,3],4,5]

(4) object.assign 合併多個物件

第一層的屬性確實深拷貝,擁有了獨立的記憶體,但更深的屬性卻仍然公用了位址

var a = [0, 1, [2,3], 4],

b =object.assign(, a);

a[0] = 1;

a[2][0] = 1;

console.log(a);

//[1,1,[1,3],4]

console.log(b); //

[0,1,[1,3],4]

(5) 物件擴充套件運算子 === object.assign

第一層的屬性確實深拷貝,擁有了獨立的記憶體,但更深的屬性卻仍然公用了位址

var a = [0, 1, [2,3], 4],

b =[...a];

a[0] = 1;

a[2][0] = 1;

console.log(a);

//[1,1,[1,3],4]

console.log(b); //

[0,1,[1,3],4]

3、深拷貝

(1) json方法(只能拷貝簡單物件,物件裡面包含函式無法拷貝)

json.parse(json.stringify(obj))

(2) for迴圈遞迴實現

(3) jquery可以$.extend(true, {}, obj)

(4)第三方函式lodash的_.clonedeep

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...

深拷貝 淺拷貝

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝 深拷貝

retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,re...