深拷贝和浅拷贝的区别和实现方法

19 阅读2分钟

深拷贝和浅拷贝是在编程中常用的两种拷贝对象的方式。

浅拷贝是指创建一个新的对象,新对象的属性值是原对象的引用。也就是说,新对象和原对象的属性指向同一个内存地址。当原对象的属性值发生变化时,新对象的属性值也会同时发生变化。

深拷贝是指创建一个新的对象,新对象的属性值是原对象属性值的副本。也就是说,新对象和原对象的属性值分别指向不同的内存地址。当原对象的属性值发生变化时,新对象的属性值不会受到影响。

实现浅拷贝的方法有:

  1. 扩展运算符(...):可以将一个对象的所有属性拷贝到另一个对象中。
const obj1 = { name: 'Fengfeng', age: 18 };
const obj2 = { ...obj1 };
  1. Object.assign()方法:可以将一个或多个源对象的属性复制到目标对象中。
const obj1 = { name: 'Fengfeng', age: 18 };
const obj2 = Object.assign({}, obj1);
  1. Array.prototype.slice()方法(对于数组):可以创建一个新数组,包含原数组的所有元素。
const arr1 = [1, 2, 3, 4, 5];
const arr2 = arr1.slice();

实现深拷贝的方法有:

  1. 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())方法深拷贝对象时,如果对象中存在函数、正则等特殊类型的属性,这些属性会在序列化过程中被忽略掉。

总结起来,浅拷贝只是拷贝了对象的引用,而深拷贝则是拷贝了对象的值。在选择拷贝方法时,根据具体的需求来决定使用哪种方式。