返回

JS之对象复制:浅拷贝和深拷贝

前端

什么是对象复制?

在JavaScript中,对象是一种复杂的数据类型,它可以包含属性和方法。对象复制是将一个对象的内容复制到另一个对象。这可以用于创建对象的新副本,或在两个对象之间共享数据。

浅拷贝

浅拷贝只复制对象的属性值,但不复制对象的引用。这意味着如果对象包含对其他对象的引用,那么浅拷贝将只复制对这些对象的引用,而不是这些对象的实际内容。

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

const obj2 = Object.assign({}, obj1);

console.log(obj2);

输出:

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

在上面的示例中,obj2obj1的浅拷贝。obj2具有与obj1相同的属性值,但obj2address对象的引用与obj1相同。这意味着对obj2.address的任何更改也会反映在obj1.address上。

深拷贝

深拷贝不仅复制对象的属性值,还复制对象的引用。这意味着如果对象包含对其他对象的引用,那么深拷贝将递归地复制这些对象的内容。

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

const obj2 = JSON.parse(JSON.stringify(obj1));

console.log(obj2);

输出:

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

在上面的示例中,obj2obj1的深拷贝。obj2具有与obj1相同的属性值,并且obj2address对象的引用与obj1不同。这意味着对obj2.address的任何更改都不会反映在obj1.address上。

浅拷贝和深拷贝的应用场景

浅拷贝和深拷贝都有各自的应用场景。浅拷贝通常用于创建对象的新副本,而深拷贝通常用于在两个对象之间共享数据。

浅拷贝的应用场景:

  • 创建对象的新副本,以便对新副本进行修改而不会影响原始对象。
  • 将对象的数据传递给函数,而无需担心函数会修改原始对象。
  • 在两个对象之间共享数据,但不需要共享对象的引用。

深拷贝的应用场景:

  • 在两个对象之间共享数据,并且需要共享对象的引用。
  • 创建对象的备份,以便在需要时可以还原到备份。
  • 将对象的数据序列化为JSON字符串,以便可以在网络上传输或存储在数据库中。

总结

JavaScript中的对象复制有浅拷贝和深拷贝两种方式。浅拷贝只复制对象的属性值,但不复制对象的引用。深拷贝不仅复制对象的属性值,还复制对象的引用。浅拷贝和深拷贝都有各自的应用场景。浅拷贝通常用于创建对象的新副本,而深拷贝通常用于在两个对象之间共享数据。