- Published on
Deepcopy | DeepClone | 深拷贝
- Authors
- Name
- Shelton Ma
在 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,因为深拷贝复制了独立的副本