structuredClone 是现代浏览器首选的深拷贝方案,能正确复制 Date、RegExp、Map 等特殊类型;旧环境需手动实现或使用 lodash.cloneDeep。

JavaScript 中直接用 Object.assign 或展开运算符({...obj})只能做浅拷贝,对 Date、RegExp、Map、Set、ArrayBuffer 等特殊类型对象,会复制引用而非新实例——这意味着修改副本会影响原对象。要真正拷贝包含 Date 的对象,需使用深拷贝并正确处理特殊类型。
用 structuredClone(现代浏览器首选)
structuredClone 是浏览器原生支持的深拷贝 API,能自动识别并重建 Date、RegExp、Map、Set、TypedArray 等,且保持类型和值准确。它不支持函数、undefined、Symbol 和循环引用,但对大多数数据对象已足够可靠。
- ✅ 支持
Date:拷贝后是独立的新Date实例,修改互不影响 - ✅ 语法简洁:
const copy = structuredClone(originalObj); - ⚠️ 注意:Node.js 17+ 需启用
--experimental-structured-cloning;Node.js 18.15+ 和 20.6+ 默认启用
手动实现兼容性深拷贝(含 Date 处理)
当需支持旧环境(如 IE 或低版本 Node),可写一个轻量级深拷贝函数,对 Date 显式调用 new Date(date.getTime()),其他内置类型也分类处理:
- 检测
instanceof Date→ 返回new Date(obj.getTime()) - 检测
obj instanceof RegExp→ 返回new RegExp(obj) - 普通对象/数组 → 递归遍历属性,对每个值调用拷贝函数
- 基本类型(string/number/boolean/null)→ 直接返回
示例关键逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj.getTime());
if (obj instanceof RegExp) return new RegExp(obj);
if (Array.isArray(obj)) return obj.map(deepClone);
const cloned = {};
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
cloned[key] = deepClone(obj[key]);
}
}
return cloned;
}
避免 JSON.parse(JSON.stringify()) 的坑
这种“伪深拷贝”写法看似简单,但会丢失 Date 类型:因为 JSON.stringify(new Date()) 输出字符串(如 "2024-05-10T08:00:00.000Z"),再 JSON.parse 得到的是字符串而非 Date 对象。
- ❌
Date变成字符串,失去方法(如.getDate()) - ❌ 丢失
undefined、function、Symbol、NaN、Infinity - ❌ 无法处理循环引用,直接报错
第三方库(如 lodash.cloneDeep)
如果项目已引入 Lodash,_.cloneDeep 是成熟可靠的方案,内部已完整处理 Date、RegExp、Map、Set、Uint8Array 等所有常见类型,还支持自定义克隆逻辑。
- ✅ 开箱即用,覆盖边界情况全面
- ✅ 支持循环引用检测与处理
- ⚠️ 注意体积:若仅需
Date拷贝,引入整包略重;可考虑按需导入cloneDeep

















