深拷贝中Date和RegExp需特殊处理:JSON.stringify会丢失信息;手动实现需类型判断并重建实例;现代推荐structuredClone(),兼容性不足时可用lodash.cloneDeep或自定义递归函数。

深拷贝中 Date 和 RegExp 的常见问题
原生 JSON.stringify 无法处理 Date、RegExp、Function、undefined、Symbol 等类型,序列化后会丢失或变成空对象、null 或字符串。例如:
new Date() → "{}";/abc/g → "{}";function(){} → undefined
手动实现时识别并重建特殊对象
核心思路是:递归遍历时,先判断值的类型,对已知特殊对象不走通用递归逻辑,而是直接新建对应实例。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Date:用
new Date(obj.getTime())或new Date(obj.toString())复制 -
RegExp:用
new RegExp(obj.source, obj.flags)(注意 IE 不支持obj.flags,可改用obj.toString().match(/\/(.+)\/([gmiyus]*)/)提取) -
Map / Set:分别用
new Map([...obj])和new Set([...obj]) -
ArrayBuffer / TypedArray:需用
obj.slice()或new obj.constructor(obj)
使用结构化克隆(structuredClone)——现代推荐方案
structuredClone() 是浏览器和 Node.js(v17.0+)原生支持的深拷贝 API,能正确处理 Date、RegExp、Map、Set、ArrayBuffer、TypedArray、BigInt、ImageData 等,且自动处理循环引用。
- ✅ 一行搞定:
const copy = structuredClone(original) - ⚠️ 注意:不支持 Function、undefined、Symbol、Promise、Window 等非可传输对象(会抛错)
- ? 兼容性检查:
typeof structuredClone === 'function',否则需回退到自定义实现
兼容性兜底:Lodash 的 cloneDeep 或轻量封装
若需支持老旧环境,lodash.cloneDeep 是成熟选择,内部已完整处理 Date、RegExp、Error、Map、Set 等类型,并支持自定义克隆逻辑(通过 customizer 参数)。
- 轻量替代可参考
klona(专注基础对象/数组,不处理 Date/RegExp)或自行封装带特殊类型分支的递归函数 - 自己写时建议用
Object.prototype.toString.call(obj)判断类型,比instanceof更可靠(避免跨 iframe 问题) - 记得处理循环引用:用 WeakMap 缓存已拷贝的对象,遇到重复引用直接返回缓存结果

















