一、瞭解 基本數據類型保存在棧記憶體中,按值訪問,引用數據類型保存在堆記憶體中,按址訪問。 二、淺拷貝 淺拷貝只是複製了指向某個對象的指針,而不是複製對象本身,新舊對象其實是同一記憶體地址的數據,修改其中一個值,另一個也會動態改變。 三、深拷貝 深拷貝是真正意義上實現了數組和對象的拷貝,它創建了另外一個一 ...
一、瞭解
基本數據類型保存在棧記憶體中,按值訪問,引用數據類型保存在堆記憶體中,按址訪問。
二、淺拷貝
淺拷貝只是複製了指向某個對象的指針,而不是複製對象本身,新舊對象其實是同一記憶體地址的數據,修改其中一個值,另一個也會動態改變。
三、深拷貝
深拷貝是真正意義上實現了數組和對象的拷貝,它創建了另外一個一模一樣的對象,和原對象不是一個記憶體地址,修改一個值不會影響另一個的值。
四、封裝實現深淺拷貝的函數
//封裝函數 實現深淺拷貝 deep為true深拷貝 false淺拷貝
function copy(oldObj,deep){
let newObj = {};
if (oldObj instanceof Array){
newObj = [];
}
for (let key in oldObj){
let value = oldObj[key];
if (!!deep && typeof value === "object" && value !== null){ //如果原對象的某個屬性是引用類型數據,遞歸調用copy
newObj[key] = copy(value,deep);
} else{ //如果原對象的某個屬性是基本類型數據,直接將此屬性賦值給新對象的相應屬性
newObj[key] = value;
}
}
return newObj;
}
效果如下:
let obj1 = {a:1,b:{c:2}};
let obj2 = copy(obj1,true); //深拷貝
let obj3 = copy(obj1,false); //淺拷貝
obj1.b.c = 3;
console.log(obj2); //{a:1,b:{c:2}}
console.log(obj3); //{a:1,b:{c:3}}
本文僅僅簡述了js深淺拷貝,以及實現深淺拷貝的簡單代碼,如有不當之處,請各位指正!謝謝!
2018-11-14