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
,实现深度复制。