我理解的淺拷貝和深拷貝

2022-05-01 16:48:10 字數 3433 閱讀 3738

淺拷貝:通過乙個物件來建立乙個新物件,如果物件的屬性的值是基本資料型別,直接把值賦給新物件,如果值是引用型別則把資料的對應的記憶體位址賦給新物件;因為兩個物件對應的是同乙個記憶體位址,當其中乙個物件資料改變了,就相當於改變了記憶體位址,所以會影響到別乙個物件;

var obj1 = ;

var obj2 =obj1;

obj2.b = 22;

console.log(obj1.b);

//22

var obj1 = ;

var obj2 = ;

object.assign(obj1, obj2);

console.log(obj1)

= 4;

console.log(obj1.c)

//3

乍一看,這貌似兩個物件互不影響了!難道是深拷貝了?

var obj1 = ;

var obj2 = };

object.assign(obj1, obj2);

console.log(obj1); //}

console.log(obj2); //

}obj2.c.z = 4;

console.log(obj1.c.z);

//4;

由些可見,object.assign只是對第一層資料進行了深拷貝,實際上依然是乙個淺拷貝。

var obj1 =

};var obj2 =;

console.log(obj2);

// }

obj1.a = 11;

console.log(obj2.a); //1

obj1.c.z = 33;

console.log(obj2.c.z);

//33

由此可見...擴充套件運算子跟assign一樣也是淺拷貝。

var arr1 = [1, [2, 3], 4];

var arr2 =arr1.slice();

console.log(arr2);

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

arr1[0] = 11;

console.log(arr2[0]); //

1; 貌似深拷貝了,但是:

arr1[1][0] = 22;

console.log(arr2);

//[1, [22, 3], 4; 還是太年輕啊!!!

var arr1 = [1, [2, 3], 4];

var arr2 =arr1.concat();

console.log(arr2);

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

arr1[0] = 11;

console.log(arr2[0]); //

1;arr1[1][0] = 22;

console.log(arr2[1][0]); //

22

深拷貝的方法:原理是:把乙個物件序列化成為乙個json字串,將物件的內容轉換成字串的形式再儲存在磁碟上,再用json.parse()反序列化將json字串變成乙個新的物件;

var obj1 =

};var obj2 =json.parse(json.stringify(obj1));

console.log(obj2);

// }

obj1.c.z = 33; 

console.log(obj2.c.z);

//3

由此可見,已經實現了深拷貝!

但是,json.stringify()有個問題:無法拷貝函式、undefined、symbol值,因為其在序列化時會忽略這些值;

var obj1 =

};var obj2 =json.parse(json.stringify(obj1));

console.log(obj2);

//

2.遞迴:

哇~ 完美!!! 感覺得到了整個世界呢!

但是:

let y =;

let newy =deepcopy(y);

console.log(newy)

//-->

[symbol("z")]: "d" 呢?

原來 for..in 是無法獲取symbol作為健名的元素的! 那該怎麼辦呢? 我們可以利用reflect.ownkeys()來得到包括symbol在內所有例項的屬性,從而可以實現symbol屬性的深拷貝!!!

/*

* * s.工具函式

* */

//判斷是否是物件(函式和object,不包括null)

function

isobject(obj)

//internal function for creating a tostring-based type tester. (underscore判斷資料型別[object array] 和 [object object])- tagtester('object')

function

tagtester(name) ;}//

判斷是否為資料(原生支援)

let isarray =array.isarray;/**

* e.工具函式

* */

//深拷貝

這樣一來就真的得到了整個世界了!

理解「淺拷貝」和「深拷貝」

淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...

深拷貝和淺拷貝的理解

為什麼要使用深拷貝和淺拷貝?當你想複製乙個物件時,一般做法是obj2 obj1,但是當你改動obj2的時候,會影響到obj1,而obj1也會影響到obj2,所以需要深拷貝和淺拷貝來解決物件的直接賦值仍然 連線 的問題。淺拷貝 複製乙份引用,讓所有引用物件指向乙份資料,並且可以修改這份資料,即只對指標...

深拷貝和淺拷貝的理解

物件之間賦值本質上 是物件之間的引用傳遞而已。也就是多個物件指向同乙個資料空間。淺拷貝是對乙個物件的頂層資料的拷貝。深拷貝是對於乙個物件所有層次的拷貝 遞迴 注意 型別 int型別,long型別 python3已去除long型別,只剩下int型別的資料 屬於物件,不是變數 深淺拷貝的作用 1,減少記...