javascript 对象-深浅拷贝,深度揭秘不同拷贝方法
2023-12-06 09:03:56
浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。因此,如果其中一个对象改变了这个地址,就会影响到另一个对象。也就是说,默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员一次拷贝),即只复制对象空间而不复制资源。
Object.assign()方法可以实现浅拷贝。它的语法为:
Object.assign(target, ...sources)
其中,target 是目标对象,sources 是要拷贝的源对象。Object.assign()方法会将 sources 对象中的所有可枚举属性拷贝到 target 对象中。
const obj1 = {
name: 'John Doe',
age: 30
};
const obj2 = Object.assign({}, obj1);
obj2.age = 35;
console.log(obj1.age); // 30
console.log(obj2.age); // 35
在这个示例中,obj2 是 obj1 的一个浅拷贝。当我们改变 obj2 的 age 属性时,obj1 的 age 属性不会受到影响。这是因为浅拷贝只拷贝了 obj1 的属性值,并没有拷贝 obj1 的引用。
深拷贝
深拷贝会递归地拷贝对象及其所有属性,包括嵌套的对象和数组。这样,即使改变了其中一个对象的属性,也不会影响到另一个对象。
要实现深拷贝,可以使用 JSON.parse(JSON.stringify()) 方法。它的语法为:
JSON.parse(JSON.stringify(obj))
其中,obj 是要拷贝的对象。JSON.stringify() 方法会将 obj 转换为 JSON 字符串,JSON.parse() 方法会将 JSON 字符串转换为对象。这样,就可以实现对象及其所有属性的深度拷贝。
const obj1 = {
name: 'John Doe',
age: 30,
address: {
street: '123 Main Street',
city: 'Anytown',
state: 'CA',
zip: '12345'
}
};
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.age = 35;
obj2.address.street = '456 Elm Street';
console.log(obj1.age); // 30
console.log(obj1.address.street); // 123 Main Street
console.log(obj2.age); // 35
console.log(obj2.address.street); // 456 Elm Street
在这个示例中,obj2 是 obj1 的一个深拷贝。当我们改变 obj2 的 age 属性和 address.street 属性时,obj1 的属性值不会受到影响。这是因为深拷贝复制了 obj1 的所有属性值,包括嵌套的对象和数组。
总结
浅拷贝和深拷贝是 JavaScript 中两种截然不同的拷贝方式。浅拷贝只拷贝对象的空间,而深拷贝会递归地拷贝对象及其所有属性,包括嵌套的对象和数组。了解它们之间的区别对于编写健壮的 JavaScript 代码至关重要。