Published on

Deepcopy | DeepClone | 深拷贝

Authors
  • avatar
    Name
    Shelton Ma
    Twitter

在 Node.js 中,深拷贝(deep copy)对象的方式

1. 使用 structuredClone()(推荐,Node.js 17+)

适用场景:适用于 对象、数组、Map、Set、Date、RegExp,不支持 函数或 undefined.

const deepCopy = structuredClone(originalObject);

2. 使用 lodash.cloneDeep()

适用场景:适用于任何复杂对象,包括 函数、Date、RegExp.

import _ from 'lodash';

const deepCopy = _.cloneDeep(originalObject);

3. 使用 JSON.parse(JSON.stringify(obj))(简单但有局限)

适用场景:适用于 简单对象和数组,但不支持 Date、RegExp、Map、Set、undefined、函数等.

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

4. 自己实现

function deepClone(obj) {
  if (obj === null || typeof obj !== "object") return obj;
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);
  if (Array.isArray(obj)) return obj.map(deepClone);

  const copy = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      copy[key] = deepClone(obj[key]);
    }
  }
  return copy;
}

const obj = { a: 1, b: { c: 2 }, d: new Date(), e: /abc/ };
const copy = deepClone(obj);

console.log(copy); // 深拷贝对象
console.log(copy.d instanceof Date); // true
console.log(copy.e instanceof RegExp); // true

在 Python 中,deepcopy 和 copy 的区别是什么

copy.copy() 是浅拷贝,只复制对象本身的引用,而不复制对象内部嵌套的可变对象. copy.deepcopy() 是深拷贝,会递归地复制对象及其内部嵌套的所有可变对象.

import copy

a = [[1, 2], [3, 4]]
b = copy.copy(a)  # 浅拷贝
c = copy.deepcopy(a)  # 深拷贝

a[0][0] = 999
print(b[0][0])  # 输出 999,因为浅拷贝只复制引用
print(c[0][0])  # 输出 1,因为深拷贝复制了独立的副本