返回

深拷贝的两种实现方法,彻底搞懂深拷贝与浅拷贝差异

前端

前言

在编程中,我们经常需要复制对象。对象的复制方式有两种:浅拷贝和深拷贝。浅拷贝只是创建了一个新的对象,复制了原有对象的基本类型的值,而引用数据类型只拷贝了一层属性,再深层的还是无法进行拷贝。如果其中一个对象改变了其中的值,另一个对象也会随之改变。深拷贝则会创建新的对象,并复制原有对象的所有属性,包括引用数据类型。这样,即使其中一个对象改变了其中的值,另一个对象也不会受到影响。

实现方法

1. 浅拷贝

浅拷贝可以通过以下方式实现:

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

const obj2 = Object.assign({}, obj1);
  • Python:
import copy

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

obj2 = copy.copy(obj1)

2. 深拷贝

深拷贝可以通过以下方式实现:

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

const obj2 = JSON.parse(JSON.stringify(obj1));
  • Python:
import copy

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

obj2 = copy.deepcopy(obj1)

差异

浅拷贝和深拷贝的主要差异在于,浅拷贝只复制了原有对象的基本类型的值,而引用数据类型只拷贝了一层属性,再深层的还是无法进行拷贝。而深拷贝则会创建新的对象,并复制原有对象的所有属性,包括引用数据类型。

应用场景

  • 浅拷贝: 当您只需要复制对象的基本类型的值时,可以使用浅拷贝。例如,如果您有一个对象包含一个字符串、一个数字和一个布尔值,则可以使用浅拷贝来复制这个对象。
  • 深拷贝: 当您需要复制对象的所有属性,包括引用数据类型时,可以使用深拷贝。例如,如果您有一个对象包含一个数组、一个对象或一个函数,则可以使用深拷贝来复制这个对象。

总结

浅拷贝和深拷贝是两种不同的对象复制方式,它们的区别在于浅拷贝只复制了原有对象的基本类型的值,而引用数据类型只拷贝了一层属性,再深层的还是无法进行拷贝。而深拷贝则会创建新的对象,并复制原有对象的所有属性,包括引用数据类型。您可以根据实际情况选择合适的复制方式。