返回
深拷贝的两种实现方法,彻底搞懂深拷贝与浅拷贝差异
前端
2024-02-15 16:26:28
前言
在编程中,我们经常需要复制对象。对象的复制方式有两种:浅拷贝和深拷贝。浅拷贝只是创建了一个新的对象,复制了原有对象的基本类型的值,而引用数据类型只拷贝了一层属性,再深层的还是无法进行拷贝。如果其中一个对象改变了其中的值,另一个对象也会随之改变。深拷贝则会创建新的对象,并复制原有对象的所有属性,包括引用数据类型。这样,即使其中一个对象改变了其中的值,另一个对象也不会受到影响。
实现方法
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)
差异
浅拷贝和深拷贝的主要差异在于,浅拷贝只复制了原有对象的基本类型的值,而引用数据类型只拷贝了一层属性,再深层的还是无法进行拷贝。而深拷贝则会创建新的对象,并复制原有对象的所有属性,包括引用数据类型。
应用场景
- 浅拷贝: 当您只需要复制对象的基本类型的值时,可以使用浅拷贝。例如,如果您有一个对象包含一个字符串、一个数字和一个布尔值,则可以使用浅拷贝来复制这个对象。
- 深拷贝: 当您需要复制对象的所有属性,包括引用数据类型时,可以使用深拷贝。例如,如果您有一个对象包含一个数组、一个对象或一个函数,则可以使用深拷贝来复制这个对象。
总结
浅拷贝和深拷贝是两种不同的对象复制方式,它们的区别在于浅拷贝只复制了原有对象的基本类型的值,而引用数据类型只拷贝了一层属性,再深层的还是无法进行拷贝。而深拷贝则会创建新的对象,并复制原有对象的所有属性,包括引用数据类型。您可以根据实际情况选择合适的复制方式。