structuredClone能正确复制Date、RegExp、Array、Object、Map、Set、TypedArray、BigInt、Boolean、String、Number、null等类型,但不支持函数、Promise、Error、DOM节点、WeakMap、WeakSet。

直接用 structuredClone 就行,它原生支持 Date 和 RegExp,无需额外处理。
哪些类型能被 structuredClone 正确复制
structuredClone 是浏览器和 Node.js(v17.0+)内置的深拷贝方法,对常用内置对象有完整支持:
-
Date→ 复制后仍是独立的Date实例,时间值相同但引用不同 -
RegExp→ 复制后保留source、flags和lastIndex(如果可写) -
Array、Object、Map、Set、TypedArray、BigInt、Boolean、String、Number、null、undefined(在支持的上下文中)等均原生支持 -
注意:函数、
Promise、Error、DOM 节点、WeakMap、WeakSet不支持,会抛错或被忽略
表单对象中 Date 和 RegExp 的典型场景
比如一个带校验规则和时间字段的表单对象:
const form = {
name: "张三",
birthday: new Date("1990-05-12"),
emailPattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
tags: ["user", "active"],
metadata: new Map([["createdAt", new Date()]]),
};
直接克隆即可保持语义和行为一致:
const cloned = structuredClone(form);
console.log(cloned.birthday instanceof Date); // true
console.log(cloned.emailPattern.test("a@b.c")); // true
console.log(cloned.birthday === form.birthday); // false(不同实例)
console.log(cloned.emailPattern.toString() === form.emailPattern.toString()); // true
兼容性与降级建议
若需支持较老环境(如 Safari
- 先检查
typeof structuredClone === 'function' - 不支持时,用轻量 JSON 替代方案(仅限纯数据)或手动处理
Date/RegExp - 例如降级时:遍历对象,遇到
Date用new Date(date.getTime()),遇到RegExp用new RegExp(reg.source, reg.flags) - 避免使用 lodash.cloneDeep 等通用库——它们对
RegExp默认只复制source和flags,丢失lastIndex;而structuredClone会保留(只要lastIndex可枚举且非只读)
性能提示:大数据量下更稳更快
相比 JSON.parse(JSON.stringify()) 或递归实现,structuredClone 在大量 Date/RegExp 场景下优势明显:
- 不经过字符串序列化,无精度损失(如毫秒级
Date、特殊 Unicode 正则) - 底层用结构化克隆算法,对循环引用安全(自动处理,不爆栈)
- V8 和 SpiderMonkey 已深度优化,实测比手写递归快 2–5 倍(尤其 >1000 个
Date对象时)

















