在JavaScript中,深拷贝是一种复制对象的方法,它会复制对象的所有属性和值,包括嵌套的对象和数组,并创建一个新的对象。以下是几种常见的深拷贝方法:
- 使用JSON.stringify和JSON.parse
这种方法适用于大部分对象,但无法复制函数、undefined和Symbol值。
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = deepCopy(obj1);
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,证明obj1和obj2是独立的
- 使用递归
这种方法可以处理更复杂的情况,包括循环引用和特殊类型的值。
function deepCopy(obj, hash = new WeakMap()) {
if (obj == null) return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
if (typeof obj === 'object') {
if (hash.has(obj)) return hash.get(obj);
let newObj = Array.isArray(obj) ? [] : {};
hash.set(obj, newObj);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key], hash);
}
}
return newObj;
} else {
return obj;
}
}
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = deepCopy(obj1);
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,证明obj1和obj2是独立的
- 使用第三方库
还有一些第三方库如 lodash 提供了深拷贝的方法 _.cloneDeep()
。
const _ = require('lodash');
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = _.cloneDeep(obj1);
obj2.b.c = 3;
console.log(obj1.b.c); // 输出 2,证明obj1和obj2是独立的
需要注意的是,每种深拷贝方法都有其适用的场景和限制。例如,使用JSON.stringify和JSON.parse的方法无法复制函数、undefined和Symbol值。使用递归的方法可以处理更复杂的情况,但也可能遇到性能问题。因此,在选择深拷贝方法时,需要根据具体的需求和场景进行考虑。