深拷贝和浅拷贝是在编程中常用的两种拷贝对象的方式。
浅拷贝是指创建一个新的对象,新对象的属性值是原对象的引用。也就是说,新对象和原对象的属性指向同一个内存地址。当原对象的属性值发生变化时,新对象的属性值也会同时发生变化。
深拷贝是指创建一个新的对象,新对象的属性值是原对象属性值的副本。也就是说,新对象和原对象的属性值分别指向不同的内存地址。当原对象的属性值发生变化时,新对象的属性值不会受到影响。
实现浅拷贝的方法有:
- 扩展运算符(...):可以将一个对象的所有属性拷贝到另一个对象中。
const obj1 = { name: 'Fengfeng', age: 18 };
const obj2 = { ...obj1 };
- Object.assign()方法:可以将一个或多个源对象的属性复制到目标对象中。
const obj1 = { name: 'Fengfeng', age: 18 };
const obj2 = Object.assign({}, obj1);
- Array.prototype.slice()方法(对于数组):可以创建一个新数组,包含原数组的所有元素。
const arr1 = [1, 2, 3, 4, 5];
const arr2 = arr1.slice();
实现深拷贝的方法有:
- JSON.parse(JSON.stringify())方法:可以将一个对象序列化为JSON字符串,再通过JSON.parse()方法将JSON字符串解析为新的对象。
const obj1 = { name: 'Fengfeng', age: 18 };
const obj2 = JSON.parse(JSON.stringify(obj1));
需要注意的是,使用JSON.parse(JSON.stringify())方法深拷贝对象时,如果对象中存在函数、正则等特殊类型的属性,这些属性会在序列化过程中被忽略掉。
总结起来,浅拷贝只是拷贝了对象的引用,而深拷贝则是拷贝了对象的值。在选择拷贝方法时,根据具体的需求来决定使用哪种方式。