返回
让程序动若脱兔的秘籍:JS深拷贝与浅拷贝揭秘
前端
2023-09-09 05:54:13
进入正题,我们先从浅拷贝开始。浅拷贝只复制对象的第一层,而不会递归复制对象中嵌套的对象。这就好比复印机只复印纸张正面,而不复印背面一样。
const obj = {
name: 'John Doe',
address: {
street: '123 Main Street',
city: 'Anytown',
state: 'CA',
zip: '12345',
},
};
const b = Object.assign({}, obj);
console.log(b);
执行这段代码后,b
将指向一个新对象,该对象包含 obj
对象第一层的副本。这意味着 b.name
将等于 "John Doe"
,但 b.address
将指向同一个对象。
如果我们修改 b.address.street
的值,我们也会修改 obj.address.street
的值,因为它们都指向同一个对象。
b.address.street = '456 Elm Street';
console.log(obj.address.street); // 456 Elm Street
现在我们来看深拷贝。深拷贝会递归复制对象中的所有属性,包括嵌套的对象。这就好比复印机不仅复印纸张正面,还会复印背面一样。
const obj = {
name: 'John Doe',
address: {
street: '123 Main Street',
city: 'Anytown',
state: 'CA',
zip: '12345',
},
};
const b = JSON.parse(JSON.stringify(obj));
console.log(b);
执行这段代码后,b
将指向一个新对象,该对象包含 obj
对象的深拷贝。这意味着 b.name
将等于 "John Doe"
,并且 b.address
将指向一个新对象,该对象包含 obj.address
的副本。
如果我们修改 b.address.street
的值,我们不会修改 obj.address.street
的值,因为它们指向不同的对象。
b.address.street = '456 Elm Street';
console.log(obj.address.street); // 123 Main Street
现在您已经了解了浅拷贝和深拷贝之间的区别。浅拷贝只复制对象的第一层,而深拷贝会递归复制对象中的所有属性。
浅拷贝通常用于需要快速复制对象的情况,而深拷贝通常用于需要创建对象副本的情况。例如,如果您需要创建一个对象副本,以便您可以对副本进行修改,而不影响原始对象,那么您应该使用深拷贝。