function deepClone(obj, hash = new WeakMap()) {// 处理 null、undefined、非对象的情况(直接返回值)if (obj === null || typeof obj !== 'object') return obj;// 防止循环引用if (hash.has(obj)) return hash.get(obj);// 支持 Date、RegExp 类型if (obj instanceof Date) return new Date(obj);if (obj instanceof RegExp) return new RegExp(obj);// 创建对象或数组的副本const clone = Array.isArray(obj) ? [] : {};hash.set(obj, clone);// 递归拷贝每一个属性for (const key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key], hash);}}return clone;
}
解释
- 类型判断:对于
null
、undefined
和非对象类型直接返回。
- 循环引用:使用
WeakMap
防止循环引用导致的无限递归。
- 特殊对象处理:
Date
和 RegExp
类型分别创建新的实例。
- 递归拷贝:对于每个属性,递归调用
deepClone
,实现深度复制。