返回

深入浅出 JavaScript 浅拷贝和深拷贝

前端

在 JavaScript 中,拷贝对象有两种主要方式:浅拷贝和深拷贝。理解这两种方式之间的区别非常重要,因为它们对数据的复制行为有本质上的不同,浅拷贝只复制对象的引用,而深拷贝复制对象的实际值。

浅拷贝

浅拷贝创建一个新对象,其拷贝了原对象的第一层引用。即当原对象的属性值是基本数据类型时,直接拷贝其值;当原对象的属性值是对象时,将拷贝指向该对象的引用。

以下代码演示浅拷贝:

const originalObject = {
  name: "John Doe",
  age: 30,
  address: {
    street: "123 Main Street",
    city: "Anytown",
    state: "CA",
  },
};

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

console.log(copiedObject);

输出:

{
  name: "John Doe",
  age: 30,
  address: {
    street: "123 Main Street",
    city: "Anytown",
    state: "CA",
  },
}

可以看到,copiedObject 中包含了 originalObject 中的所有属性,包括嵌套对象 address。但是,address 属性指向的是同一个对象,而不是它的副本。

深拷贝

深拷贝创建一个新对象,并复制原对象的所有属性值,包括嵌套对象的属性值。深拷贝的目的是创建一个完全独立的新对象,与原对象没有任何共享的引用。

以下代码演示深拷贝:

const originalObject = {
  name: "John Doe",
  age: 30,
  address: {
    street: "123 Main Street",
    city: "Anytown",
    state: "CA",
  },
};

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

console.log(copiedObject);

输出:

{
  name: "John Doe",
  age: 30,
  address: {
    street: "123 Main Street",
    city: "Anytown",
    state: "CA",
  },
}

可以看到,copiedObject 中包含了 originalObject 中的所有属性,包括嵌套对象 address。但是,address 属性指向的是一个新的对象,而不是与原对象共享引用。

浅拷贝和深拷贝的区别

下表总结了浅拷贝和深拷贝之间的主要区别:

特征 浅拷贝 深拷贝
复制方式 复制引用 复制实际值
共享引用
嵌套对象 引用嵌套对象 复制嵌套对象
性能 更快 更慢
用例 当您只需要复制对象的基本属性时 当您需要复制对象的所有属性,包括嵌套对象的属性时

结论

浅拷贝和深拷贝是 JavaScript 中复制对象时常用的两种方法。理解这两种方法之间的区别非常重要,以便在开发中正确应用,避免潜在问题。浅拷贝通常用于复制简单的对象,而深拷贝通常用于复制复杂的对象,例如包含嵌套对象的对象。