返回

轻松掌握深拷贝:三种粗浅而有效的解决方案

前端

前言

在编程世界中,我们经常需要处理对象拷贝的任务。所谓拷贝,就是将一个对象的数据内容复制到另一个对象中。如果只是简单地将对象的引用复制给另一个对象,那么就属于浅拷贝。浅拷贝只拷贝对象本身的数据,而不会拷贝对象引用的对象。深拷贝则不同,它会将对象本身的数据和对象引用的对象的数据都拷贝过来。

方法一:直接赋值

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。当我们修改 obj2address 属性时,obj1address 属性也会随之改变。这是因为直接赋值只复制了对象的引用,并没有复制对象引用的对象。

方法二: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() 的方式。如果您需要复制一个复杂的对象,并且需要保持对象引用的对象不变,那么您可以使用递归拷贝函数。