返回
轻松掌握深拷贝:三种粗浅而有效的解决方案
前端
2023-09-10 04:40:40
前言
在编程世界中,我们经常需要处理对象拷贝的任务。所谓拷贝,就是将一个对象的数据内容复制到另一个对象中。如果只是简单地将对象的引用复制给另一个对象,那么就属于浅拷贝。浅拷贝只拷贝对象本身的数据,而不会拷贝对象引用的对象。深拷贝则不同,它会将对象本身的数据和对象引用的对象的数据都拷贝过来。
方法一:直接赋值
let obj1 = {
name: "John",
age: 30,
address: {
street: "123 Main Street",
city: "New York",
state: "NY",
zip: "10001",
},
};
// 直接赋值
let obj2 = obj1;
// 修改 obj2 的 address 属性
obj2.address.street = "456 Elm Street";
// 查看 obj1 的 address 属性
console.log(obj1.address.street); // 输出: 456 Elm Street
在上面的示例中,我们使用直接赋值的方式将 obj1
的引用复制给了 obj2
。当我们修改 obj2
的 address
属性时,obj1
的 address
属性也会随之改变。这是因为直接赋值只复制了对象的引用,并没有复制对象引用的对象。
方法二:JSON.parse() 和 JSON.stringify()
let obj1 = {
name: "John",
age: 30,
address: {
street: "123 Main Street",
city: "New York",
state: "NY",
zip: "10001",
},
};
// 使用 JSON.stringify() 将 obj1 转换为 JSON 字符串
let jsonStr = JSON.stringify(obj1);
// 使用 JSON.parse() 将 JSON 字符串转换为对象
let obj2 = JSON.parse(jsonStr);
// 修改 obj2 的 address 属性
obj2.address.street = "456 Elm Street";
// 查看 obj1 的 address 属性
console.log(obj1.address.street); // 输出: 123 Main Street
在上面的示例中,我们使用 JSON.stringify()
将 obj1
转换为 JSON 字符串,然后使用 JSON.parse()
将 JSON 字符串转换为对象 obj2
。由于 JSON 字符串只包含对象的纯数据,因此 obj2
是一个全新的对象,与 obj1
没有关联。
方法三:递归拷贝
let obj1 = {
name: "John",
age: 30,
address: {
street: "123 Main Street",
city: "New York",
state: "NY",
zip: "10001",
},
};
// 使用递归拷贝函数复制对象
function deepCopy(obj) {
if (typeof obj === "object") {
let newObj = {};
for (let key in obj) {
newObj[key] = deepCopy(obj[key]);
}
return newObj;
} else {
return obj;
}
}
// 使用递归拷贝函数复制 obj1
let obj2 = deepCopy(obj1);
// 修改 obj2 的 address 属性
obj2.address.street = "456 Elm Street";
// 查看 obj1 的 address 属性
console.log(obj1.address.street); // 输出: 123 Main Street
在上面的示例中,我们使用递归拷贝函数 deepCopy()
来复制对象 obj1
。该函数会递归地遍历对象的每个属性,并为每个属性创建一个新的值。如果属性的值是对象,则函数会继续递归地复制该对象。如果属性的值不是对象,则函数会直接返回该值。
总结
以上就是三种简单而有效的深拷贝方法。每种方法都有其优缺点,您可以根据自己的需要选择使用。如果您需要快速地复制一个对象,并且不关心对象引用的对象,那么您可以使用直接赋值的方式。如果您需要复制一个对象,并且需要保持对象引用的对象不变,那么您可以使用 JSON.stringify()
和 JSON.parse()
的方式。如果您需要复制一个复杂的对象,并且需要保持对象引用的对象不变,那么您可以使用递归拷贝函数。