structuredClone 可完美克隆 RegExp,保留 source、flags 和 lastIndex(含全局匹配后的值),但不保留自定义属性、getter/setter 或原型方法;需检测兼容性并降级处理。

用 structuredClone 就能完美保留 RegExp 的修饰符(如 g、i、m 等),连 source 和 flags 都原样复制,不需要手动提取再构造。
structuredClone 直接克隆 RegExp 对象
它不是靠字符串序列化,而是走浏览器底层的结构化克隆算法,所以正则的原始结构、标志、甚至 lastIndex(如果已设置)都会被完整保留:
const re = /hellos+world/gi;const cloned = structuredClone(re);console.log(cloned.toString()); // "/hello\s+world/gi"console.log(cloned.flags === re.flags); // trueconsole.log(cloned.source === re.source); // true
注意 lastIndex 是否同步
如果原始正则启用了全局匹配(g 或 y),且已执行过匹配导致 lastIndex 变化,structuredClone 也会复制当前的 lastIndex 值:
const re = /a/g; re.exec('aa'); // lastIndex → 1const copy = structuredClone(re);console.log(copy.lastIndex); // 1
这和浅克隆(new RegExp(re.source, re.flags))不同——后者总是重置 lastIndex 为 0。
兼容性与降级建议
目前主流浏览器(Chrome 98+、Firefox 94+、Safari 15.4+)均已支持 structuredClone。若需兼容旧环境,可加简单检测:
- 先检查
typeof structuredClone === 'function' - 不支持时,对 RegExp 单独用
new RegExp(re.source, re.flags)浅克隆(但会丢失lastIndex) - 避免对含函数、Symbol 或 DOM 节点的对象调用,否则直接抛
DataCloneError
不支持的边界情况
structuredClone 虽强,但对 RegExp 也有明确限制:
- 不保留自定义属性(比如你给
re.customMeta = 'v1',克隆后丢失) - 不复制 getter/setter、不可枚举属性或原型链上的方法
- 遇到
function、Symbol、undefined等非克隆类型仍会报错,即使它们混在对象里

















