一、什么是拷贝?什么是深拷贝和浅拷贝?
(1)拷贝:拷贝就是为了复用原对象的部分or全部数据,在原对象的基础上通过复制的方式创建一个新的对象。
拷贝对象可以分为三种类型:直接赋值、浅拷贝和深拷贝
(2)直接赋值:并不会创建一个新的对象,而是将原对象的引用赋给新变量。因此,修改新变量会影响到原对象。
let obj1 = { name: "Alice", age: 25 }; let obj2 = obj1;obj2.age = 30; console.log(obj1); // { name: "Alice", age: 30 } console.log(obj2); // { name: "Alice", age: 30 }
(3)浅拷贝:浅拷贝会创建一个新的对象,仅复制对象的第一层属性。如果是简单数据类型拷贝值,引用数据类型(eg:对象、数组)拷贝的是地址。 如果是单层对象,没问题,如果有多层就有问题,修改嵌套对象会影响原对象。
(4)深拷贝:会创建一个新的对象,并且递归地拷贝所有嵌套对象,使得新对象与原对象完全独立。
(深拷贝会开辟新的栈,两个对象对应两个不同的地址,修改对象A的属性,并不会影响到对象B。)
二、浅拷贝实现方法
浅拷贝会创建一个新的对象,但新对象中的属性如果是对象,则这些属性仍然指向原对象中的对应属性。因此,修改嵌套对象会影响到原对象。
1、Object.assign()
let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = Object.assign({}, obj1);obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "London" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }
2、使用展开运算符(...)实现
let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = { ...obj1 };obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "London" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }
三、深拷贝实现方法
深拷贝会创建一个新的对象,并且递归地拷贝所有嵌套对象,使得新对象与原对象完全独立。
1、通过递归实现深拷贝
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数

2、使用 JSON.parse
和 JSON.stringify
实现
let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = JSON.parse(JSON.stringify(obj1));obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "New York" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }
3、js库lodash里面cloneDeep内部实现了深拷贝
import _ from 'lodash';
let obj = { a: 1, b: [2, 3] };
let copy = _.cloneDeep(obj);