淺拷貝與深拷貝概述:
1.淺拷貝隻是拷貝一層,更深層次對象級别隻拷貝引用;
2.深拷貝拷貝多層,每一級别的資料都會拷貝;
利用原生JS實作深拷貝
原生JS的資料類型包括值類型和引用類型:
對于值類型(undefined;string;number;boolean;symbol;),可以很友善的使用指派操作,
但對于引用類型(Array,Object),簡單的進行指派操作,指派得到的隻是位址,俗稱淺拷貝,如下:
const obj = {
a: 13,
b: { name: 'zhangsan', age: 13 },
c: [1, 3, 4]
};
const obj2 = obj;
obj2.c[0] = 23;
console.log(obj.c[0]); //23
對obj2中的值修改也會更改obj中的值,是以就需要進行深拷貝操作,避免這種簡單指派操作帶來的影響,代碼如下:
const obj = {
a: 13,
b: { name: 'zhangsan', age: 13 },
c: [1, 3, 4]
};
function deepClone(obj = {}) {
//判斷值類型
if (typeof obj !== 'object' || typeof obj == null) {
return obj
};
//初始化result值
let result;
if (obj instanceof Array) {
result = [];
} else {
result = {};
};
//進行指派操作
for (let key in obj) {
//判斷key是不是obj本身所含的屬性,保證key不是原型屬性
if (obj.hasOwnProperty(key)) {
//遞歸
result[key] = deepClone(obj[key]);
}
};
return result;
}
const obj3 = deepClone(obj);
obj3.c[0] = 23;
console.log(obj.c[0]);//1
綜上,實作深拷貝有幾個注意點:
1.判斷值類型和應用類型
2.判斷是數組還是對象
3.遞歸