返回

浅拷贝与深拷贝:浅表与深刻的副本之别

前端

浅拷贝:表面上的复制

浅拷贝(shallow copy)只复制对象的引用,而不会复制对象本身。这意味着,浅拷贝只会创建一个新对象,这个新对象与原对象指向相同的内存地址。因此,如果对浅拷贝的对象进行修改,那么原对象也会受到影响。

在 JavaScript 中,可以使用 Object.assign() 方法实现浅拷贝。例如:

const originalObject = {
  name: 'John',
  age: 30
};

const shallowCopy = Object.assign({}, originalObject);

shallowCopy.name = 'Jane';

console.log(originalObject.name); // 'Jane'

在这个例子中,shallowCopy 是 originalObject 的浅拷贝。当我们修改 shallowCopy 的 name 属性时,originalObject 的 name 属性也会随之改变,这说明浅拷贝只复制了对象的引用,而不是对象本身。

深拷贝:彻底的复制

深拷贝(deep copy)不仅会复制对象的引用,还会递归地复制整个对象树。这意味着,深拷贝会创建一个新的对象,这个新对象与原对象指向不同的内存地址,并且两个对象的内容是完全独立的。

在 JavaScript 中,可以使用 JSON.parse(JSON.stringify()) 方法实现深拷贝。例如:

const originalObject = {
  name: 'John',
  age: 30
};

const deepCopy = JSON.parse(JSON.stringify(originalObject));

deepCopy.name = 'Jane';

console.log(originalObject.name); // 'John'

在这个例子中,deepCopy 是 originalObject 的深拷贝。当我们修改 deepCopy 的 name 属性时,originalObject 的 name 属性不会受到影响,这说明深拷贝不仅复制了对象的引用,还复制了对象本身。

浅拷贝与深拷贝的优缺点

浅拷贝和深拷贝各有优缺点,适合不同的场景。

浅拷贝的优点是简单高效,可以节省内存空间。但是,浅拷贝的缺点是,如果对浅拷贝的对象进行修改,那么原对象也会受到影响。

深拷贝的优点是,它可以创建一个与原对象完全独立的新对象。但是,深拷贝的缺点是,它比浅拷贝更加复杂,需要更多的内存空间。

何时使用浅拷贝

浅拷贝适用于以下场景:

  • 当你只需要复制对象的引用,而不是对象本身时。
  • 当你不想让对浅拷贝的对象的修改影响原对象时。
  • 当你希望节省内存空间时。

何时使用深拷贝

深拷贝适用于以下场景:

  • 当你想要创建一个与原对象完全独立的新对象时。
  • 当你想确保对深拷贝的对象的修改不会影响原对象时。
  • 当你不关心内存空间的使用时。

总之,浅拷贝和深拷贝都是非常重要的复制方式,它们各有优缺点,适合不同的场景。开发人员需要根据实际情况选择合适的复制方式。