在 JavaScript 中,深拷贝是指创建一个对象的完全独立的副本,包括其内部的所有嵌套对象和数组。深拷贝与浅拷贝不同,浅拷贝只复制对象的顶层属性,而深拷贝会递归地复制所有层级的属性。
JSON.parse(JSON.stringify(obj))
进行深拷贝。_.cloneDeep
方法。function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
const original = { a: 1, b: { c: 2 } };
const clone = deepClone(original);
console.log(clone); // { a: 1, b: { c: 2 } }
console.log(clone === original); // false
console.log(clone.b === original.b); // false
function deepClone(obj, hash = new WeakMap()) {
if (Object(obj) !== obj) return obj; // 基本类型直接返回
if (hash.has(obj)) return hash.get(obj); // 处理循环引用
let result = Array.isArray(obj) ? [] : {};
hash.set(obj, result);
Reflect.ownKeys(obj).forEach(key => {
result[key] = deepClone(obj[key], hash);
});
return result;
}
const original = { a: 1, b: { c: 2 } };
const clone = deepClone(original);
console.log(clone); // { a: 1, b: { c: 2 } }
console.log(clone === original); // false
console.log(clone.b === original.b); // false
const _ = require('lodash');
const original = { a: 1, b: { c: 2 } };
const clone = _.cloneDeep(original);
console.log(clone); // { a: 1, b: { c: 2 } }
console.log(clone === original); // false
console.log(clone.b === original.b); // false
WeakMap
来处理。Date
、RegExp
、Map
、Set
等特殊对象需要特殊处理。通过以上方法,你可以根据具体需求选择合适的深拷贝实现方式。
领取专属 10元无门槛券
手把手带您无忧上云