1.概念
浅拷贝:是将一个对象的属性值复制到另一个对象,如果有的属性的值为引用类型的话,那么会将这个引用的地址复制给对象,因此,两个对象会有同一个引用类型的引用,浅拷贝可以使用object.assign和展开运算符(将一个数组转为用逗号分隔的参数序列--(...))来实现。
深拷贝:是将一个对象的属性值复制到另一个对象,如果遇到属性值为引用类型的时候,它新建一个引用类型并将对应的值复制给它,因此,对象获得一个新的引用类型而不是嘴个元祐类型的引用。深拷贝对于一些对象可以使用json的两个函数(stringify(),parse())来实现,但是由于json的对象格式化比js的对象格式化更加严格,所以如果属性值里边出现函数或者symbol类型的值时,会转化失败。
2.实现方式
浅拷贝:
1.Object.assign
const a = { a: 1 ,b:2};
const b = { b: 4 };
const c = { c: 3 };
const obj = Object.assign({}, a, b, c);
obj // {a:1, b:4, c:3}
2.for in 循环遍历
function easyCopy(object) {
// 只拷贝对象
if (!object || typeof object !== "object") return;
// 根据 object 的类型判断是新建一个数组还是对象
let newObject = Array.isArray(object) ? [] : {};
// 遍历 object,并且判断是 object 的属性才拷贝
for (let key in object) {
if (object.hasOwnProperty(key)) {
newObject[key] = object[key];
}
}
return newObject;
}
深拷贝:
1.json
function deepClone(obj) {
let tojson = JSON.stringify(obj);//将对象转换为json字符串形式
let result = JSON.parse(tojson);//将转换而来的字符串转换为原生js对象
return result;
};
let obj1 = {
xiao: {
age: 20,
name: 111
},
zhang: {
age: 21,
name: 222
}
};
let test = deepClone(obj1);
console.log(test);
2.for in 循环遍历
function deepCopy(object) {
if (!object || typeof object !== "object") return;
let newObject = Array.isArray(object) ? [] : {};
for (let key in object) {
if (object.hasOwnProperty(key)) {
newObject[key] = typeof object[key] === "object" ? deepCopy(object[key]) : object[key];
}
}
return newObject;
}