返回
深拷贝:从入门到实现
前端
2023-11-15 20:12:24
好的,以下是关于从0到1实现深拷贝的文章:
从浅拷贝到深拷贝
在计算机科学中,拷贝是指将一个对象的所有数据复制到另一个对象。拷贝可以是浅拷贝或深拷贝。
浅拷贝 仅复制对象本身的数据,而不会复制其引用的对象。这意味着如果一个对象包含对另一个对象的引用,那么浅拷贝将只复制对该对象的引用,而不是该对象的实际数据。
深拷贝 会复制对象本身的数据以及其引用的所有对象的数据。这意味着如果一个对象包含对另一个对象的引用,那么深拷贝将复制对该对象的引用以及该对象的实际数据。
实现深拷贝
从头开始实现一个深拷贝函数并不难。以下是使用 JavaScript 实现深拷贝函数的步骤:
- 检查要复制的对象是否为基本类型(字符串、数字、布尔值、null、undefined)。如果是,则直接返回该对象。
- 如果要复制的对象是数组,则创建一个新数组,并遍历原数组中的每个元素,递归地复制每个元素。
- 如果要复制的对象是对象,则创建一个新对象,并遍历原对象中的每个属性,递归地复制每个属性的值。
以下是使用 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
的名称和地址,并打印 originalObject
和 copiedObject
。我们可以看到,更改 copiedObject
的属性不会影响 originalObject
,这说明深拷贝函数正确地复制了 originalObject
的数据。