1.浅拷贝
通过es6的Object.assign实现,assign方法是将除第一个参数外的后续参数全部通过对象解构将属性赋值给第一个参数,此时target对象已经改变了,obj的身上的所有属性也全部都添加给target了,然后将target的地址赋值给了result,如果不想改变原有对象的值,可以将assign设置为一个空对象
let obj = {
a: 1,
b: 2,
c: [1, 2, 3, 4],
d: {
name: "张三",
age: 13,
},
};
let target = {
state: "success",
address: {
province: "湖北",
city: "武汉",
},
};
//浅拷贝
/**方式1:
* 通过es6的Object.assign实现,assign方法是将除第一个参数外的后续参数全部通过对象解构将属性赋值给第一个参数
* 此时target对象已经改变了,obj的身上的所有属性也全部都添加给target了,然后将target的地址赋值给了result,
* 如果不想改变原有对象的值,可以将assign设置为一个空对象
*/
function simpleClone1() {
return Object.assign(target, obj);
}
console.log(simpleClone1(obj)== target); //true
//方式2:通过for..in..循环遍历属性赋值
function simpleClone(obj) {
let cloneObj = {};
for (const key in obj) {
cloneObj[key] = obj[key];
}
return cloneObj;
}
2.深拷贝
let obj = {
a: 1,
b: 2,
c: [1, 2, 3, 4],
d: {
name: "张三",
age: 13,
},
};
//深拷贝
//方式1:通过JSON反序列化实现深拷贝,因为JSON转换得到的对象又是一个新的对象
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
console.log(deepClone(obj) == obj) //false
//方式2:递归实现深拷贝
function deepClone1(newObj, oldObj) {
//for..in..遍历对象得到的对象的键、遍历数组得到的是数组的下标
for (const key in oldObj) {
if (oldObj[key] instanceof Array) {
newObj[key] = [];
deepClone1(newObj[key], oldObj[key]);
} else if (oldObj[key] instanceof Object) {
newObj[key] = {};
deepClone1(newObj[key], oldObj[key]);
} else {
newObj[key] = oldObj[key];
}
}
return newObj;
}
let newObj = {};
let obj1 = deepClone1(newObj, obj);
console.log(obj1 == obj); //false