返回

谈深谈浅谈深浅拷贝、浅度拷贝、深度拷贝

前端

浅谈深浅拷贝

浅浅拷贝是一种拷贝对象引用,即复制一个对象中的值,并将指向原对象的引用地址保存在新的对象中。这意味着修改新对象不会影响原对象,反之亦然。

浅度拷贝通常使用对象字面量语法来创建,如:

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 中两种常用的对象拷贝方式。浅浅拷贝只拷贝对象引用,而深度拷贝拷贝对象值及其子对象。浅浅拷贝通常用于创建对象的副本,而深度拷贝通常用于创建对象的克隆。