返回

深拷贝与浅拷贝:理解差异和实现方法

前端

深拷贝 vs. 浅拷贝

在编程中,拷贝操作涉及创建原始数据的副本。这对于操作和修改数据而不影响原始值非常有用。然而,并非所有拷贝操作都是平等的。在 JavaScript 中,有两种主要类型的拷贝:深拷贝和浅拷贝。

浅拷贝

浅拷贝创建新变量,但仅复制原始对象的引用。这意味着更改浅拷贝也会更改原始对象。这是因为新变量仍然指向原始对象的内存位置。

示例:

const original = { name: "John", age: 30 };
const shallowCopy = original;

shallowCopy.age = 31; // 更改浅拷贝也会更改原始对象

console.log(original.age); // 输出:31

深拷贝

深拷贝创建一个新对象,并复制原始对象的每个属性值。这意味着更改深拷贝不会影响原始对象。

实现深拷贝有几种方法:

1. 使用扩展运算符(...)

const deepCopy = { ...original };

deepCopy.age = 32; // 更改深拷贝不会影响原始对象

console.log(original.age); // 输出:31

2. 使用 JSON.parse() 和 JSON.stringify()

const deepCopy = JSON.parse(JSON.stringify(original));

deepCopy.age = 33; // 更改深拷贝不会影响原始对象

console.log(original.age); // 输出:31

3. 使用递归

对于嵌套对象,可以使用递归函数进行深拷贝:

function deepCopyRecursive(obj) {
  if (typeof obj !== "object" || obj === null) {
    return obj;
  }

  if (Array.isArray(obj)) {
    return obj.map(deepCopyRecursive);
  }

  const copy = {};
  for (const key in obj) {
    copy[key] = deepCopyRecursive(obj[key]);
  }

  return copy;
}

何时使用深拷贝或浅拷贝?

浅拷贝在数据不需要隔离修改的情况下很有用。例如,在传递对象给函数时,如果不需要对对象进行永久性更改,则浅拷贝就足够了。

深拷贝在需要隔离修改的数据的情况下很有用。例如,在创建对象的副本并对其进行编辑时,深拷贝可确保原始对象不受影响。