谈深谈浅谈深浅拷贝、浅度拷贝、深度拷贝
2024-02-07 15:53:37
浅谈深浅拷贝
浅浅拷贝是一种拷贝对象引用,即复制一个对象中的值,并将指向原对象的引用地址保存在新的对象中。这意味着修改新对象不会影响原对象,反之亦然。
浅度拷贝通常使用对象字面量语法来创建,如:
const obj1 = {
name: "张三",
age: 20,
};
const obj2 = {...obj1};
在上面的示例中,obj2 是 obj1 的浅浅拷贝。obj2 的 name 和 age 属性与 obj1 相同,但它们指向不同的内存地址。如果修改 obj2 的 name 或 age 属性,不会影响 obj1 的属性值。
深度拷贝
深度拷贝是一种拷贝对象值的拷贝,即复制一个对象中的值及其子对象,并将它们保存在新的对象中。这意味着修改新对象不会影响原对象,反之亦然。
深度拷贝通常使用 JSON.parse(JSON.stringify(obj)) 方法来创建,如:
const obj1 = {
name: "张三",
age: 20,
address: {
city: "北京",
street: "长安街",
},
};
const obj2 = JSON.parse(JSON.stringify(obj1));
在上面的示例中,obj2 是 obj1 的深度拷贝。obj2 的 name、age 和 address 属性与 obj1 相同,但它们指向不同的内存地址。如果修改 obj2 的 name、age 或 address 属性,不会影响 obj1 的属性值。
区别
浅浅拷贝和深度拷贝的主要区别在于,浅浅拷贝只拷贝对象引用,而深度拷贝拷贝对象值及其子对象。这使得深度拷贝比浅浅拷贝更加安全和可靠。
用法
浅浅拷贝通常用于创建对象的副本,而深度拷贝通常用于创建对象的克隆。
对象的副本是指与原对象具有相同属性和值的另一个对象,但它们指向不同的内存地址。对象的克隆是指与原对象具有相同属性、值和子对象结构的另一个对象,但它们指向不同的内存地址。
浅浅拷贝通常用于以下情况:
- 当您需要创建对象的副本时,例如,您需要将一个对象传递给一个函数,但您不希望修改原对象。
- 当您需要将一个对象存储在一个数组或集合中时,例如,您需要将一个对象存储在一个数组中,但您不希望修改原对象。
深度拷贝通常用于以下情况:
- 当您需要创建对象的克隆时,例如,您需要将一个对象克隆到另一个对象中,但您不希望修改原对象。
- 当您需要将一个对象序列化为 JSON 字符串时,例如,您需要将一个对象序列化为 JSON 字符串,然后将其存储在一个文件中。
总结
浅浅拷贝和深度拷贝是 JavaScript 中两种常用的对象拷贝方式。浅浅拷贝只拷贝对象引用,而深度拷贝拷贝对象值及其子对象。浅浅拷贝通常用于创建对象的副本,而深度拷贝通常用于创建对象的克隆。