返回
JS之对象复制:浅拷贝和深拷贝
前端
2023-09-22 17:35:55
什么是对象复制?
在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'
}
}
在上面的示例中,obj2
是obj1
的浅拷贝。obj2
具有与obj1
相同的属性值,但obj2
对address
对象的引用与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'
}
}
在上面的示例中,obj2
是obj1
的深拷贝。obj2
具有与obj1
相同的属性值,并且obj2
对address
对象的引用与obj1
不同。这意味着对obj2.address
的任何更改都不会反映在obj1.address
上。
浅拷贝和深拷贝的应用场景
浅拷贝和深拷贝都有各自的应用场景。浅拷贝通常用于创建对象的新副本,而深拷贝通常用于在两个对象之间共享数据。
浅拷贝的应用场景:
- 创建对象的新副本,以便对新副本进行修改而不会影响原始对象。
- 将对象的数据传递给函数,而无需担心函数会修改原始对象。
- 在两个对象之间共享数据,但不需要共享对象的引用。
深拷贝的应用场景:
- 在两个对象之间共享数据,并且需要共享对象的引用。
- 创建对象的备份,以便在需要时可以还原到备份。
- 将对象的数据序列化为JSON字符串,以便可以在网络上传输或存储在数据库中。
总结
JavaScript中的对象复制有浅拷贝和深拷贝两种方式。浅拷贝只复制对象的属性值,但不复制对象的引用。深拷贝不仅复制对象的属性值,还复制对象的引用。浅拷贝和深拷贝都有各自的应用场景。浅拷贝通常用于创建对象的新副本,而深拷贝通常用于在两个对象之间共享数据。