淺拷貝:通過乙個物件來建立乙個新物件,如果物件的屬性的值是基本資料型別,直接把值賦給新物件,如果值是引用型別則把資料的對應的記憶體位址賦給新物件;因為兩個物件對應的是同乙個記憶體位址,當其中乙個物件資料改變了,就相當於改變了記憶體位址,所以會影響到別乙個物件;
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 = ;由些可見,object.assign只是對第一層資料進行了深拷貝,實際上依然是乙個淺拷貝。var obj2 = };
object.assign(obj1, obj2);
console.log(obj1); //}
console.log(obj2); //
}obj2.c.z = 4;
console.log(obj1.c.z);
//4;
var obj1 =由此可見...擴充套件運算子跟assign一樣也是淺拷貝。};var obj2 =;
console.log(obj2);
// }
obj1.a = 11;
console.log(obj2.a); //1
obj1.c.z = 33;
console.log(obj2.c.z);
//33
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];深拷貝的方法:原理是:把乙個物件序列化成為乙個json字串,將物件的內容轉換成字串的形式再儲存在磁碟上,再用json.parse()反序列化將json字串變成乙個新的物件;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
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 =2.遞迴:};var obj2 =json.parse(json.stringify(obj1));
console.log(obj2);
//
哇~ 完美!!! 感覺得到了整個世界呢!
但是:
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,減少記...