淺拷貝
復(fù)制一層對象的屬性母市,并不包括對象里面的為引用類型的數(shù)據(jù),當(dāng)改變拷貝的對象里面的引用類型時,源對象也會改變
使用 Object.assign實現(xiàn)
let obj = {
a: 1,
b: {
c: 2
}
}
let obj1 = Object.assign({}, obj);
obj.a = 3;
obj.b.c = 4;
console.log(obj1.a) // 1
console.log(obj1.b.c) // 4
使用展開運算符...
來實現(xiàn)
let obj = {
a: 1,
b: {
c: 2
}
}
let obj1 = {...obj};
obj.a = 3;
obj.b.c = 4;
console.log(obj1.a) // 1
console.log(obj1.b.c) // 4
深拷貝
重新開辟一個內(nèi)存空間,需要遞歸拷貝對象里的引用召烂,直到子屬性都為基本類型。兩個對象對應(yīng)兩個不同的地址娃承,修改一個對象的屬性奏夫,不會改變另一個對象的屬性。
簡單的做法:JSON.parse(JSON.stringfy(obj)) 但是該方法也是有局限性的:
- 會忽略undefined
- 會忽略symbol
- 會忽略函數(shù)
- 不能解決循環(huán)引用的對象 (會報錯)
//使用遞歸的方式實現(xiàn)數(shù)組历筝、對象的深拷貝
function deepClone1(obj) {
//判斷拷貝的要進行深拷貝的是數(shù)組還是對象酗昼,是數(shù)組的話進行數(shù)組拷貝,對象的話進行對象拷貝
var objClone = Array.isArray(obj) ? [] : {};
//進行深拷貝的不能為空梳猪,并且是對象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone1(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}