返回

深拷贝:从入门到实现

前端

好的,以下是关于从0到1实现深拷贝的文章:

从浅拷贝到深拷贝

在计算机科学中,拷贝是指将一个对象的所有数据复制到另一个对象。拷贝可以是浅拷贝或深拷贝。

浅拷贝 仅复制对象本身的数据,而不会复制其引用的对象。这意味着如果一个对象包含对另一个对象的引用,那么浅拷贝将只复制对该对象的引用,而不是该对象的实际数据。

深拷贝 会复制对象本身的数据以及其引用的所有对象的数据。这意味着如果一个对象包含对另一个对象的引用,那么深拷贝将复制对该对象的引用以及该对象的实际数据。

实现深拷贝

从头开始实现一个深拷贝函数并不难。以下是使用 JavaScript 实现深拷贝函数的步骤:

  1. 检查要复制的对象是否为基本类型(字符串、数字、布尔值、null、undefined)。如果是,则直接返回该对象。
  2. 如果要复制的对象是数组,则创建一个新数组,并遍历原数组中的每个元素,递归地复制每个元素。
  3. 如果要复制的对象是对象,则创建一个新对象,并遍历原对象中的每个属性,递归地复制每个属性的值。

以下是使用 Python 实现深拷贝函数的示例:

def deep_copy(obj):
  if isinstance(obj, (int, float, bool, str, None, type(None))):
    return obj
  elif isinstance(obj, (list, tuple)):
    return [deep_copy(x) for x in obj]
  elif isinstance(obj, dict):
    return {k: deep_copy(v) for k, v in obj.items()}
  else:
    raise TypeError(f"不支持类型{type(obj)}")

使用深拷贝函数

现在我们已经实现了深拷贝函数,就可以在代码中使用它了。以下是使用深拷贝函数的示例:

const originalObject = {
  name: 'John',
  age: 30,
  address: {
    street: 'Main Street',
    city: 'New York',
    state: 'NY',
  }
};

const copiedObject = deepCopy(originalObject);

copiedObject.name = 'Jane';
copiedObject.address.city = 'Los Angeles';

console.log(originalObject);
// 输出:{ name: 'John', age: 30, address: { street: 'Main Street', city: 'New York', state: 'NY' } }

console.log(copiedObject);
// 输出:{ name: 'Jane', age: 30, address: { street: 'Main Street', city: 'Los Angeles', state: 'NY' } }

在这个示例中,我们创建了一个名为 originalObject 的对象,然后使用深拷贝函数复制该对象,并将新对象命名为 copiedObject。然后,我们更改 copiedObject 的名称和地址,并打印 originalObjectcopiedObject。我们可以看到,更改 copiedObject 的属性不会影响 originalObject,这说明深拷贝函数正确地复制了 originalObject 的数据。