优先用 structuredClone() 安全复制含 RegExp 的对象,它原生支持 source、flags 和 lastIndex;旧环境可用 Lodash cloneDeep 配 customizer 或手写递归拷贝,均需手动重建 RegExp 并赋值 lastIndex。

直接用 JSON.parse(JSON.stringify(obj)) 会把 RegExp 变成空对象 {},数据就废了。安全复制含 RegExp 的对象,关键在保留它的 source、flags 和 lastIndex 状态。
优先用 structuredClone()(现代环境)
Chrome 98+、Firefox 94+、Safari 15.4+、Node.js 18.12+ 均支持。它原生识别 RegExp,能完整复制:
- 正则表达式源字符串(
source)和修饰符(flags) - 当前匹配位置(
lastIndex),比如执行过exec()后的状态也会保留 - 自动处理循环引用,不报错也不卡死
示例:
const original = { pattern: /abc/gi, meta: "test" };original.pattern.lastIndex = 2;
const copied = structuredClone(original);
console.log(copied.pattern.lastIndex); // 2 ✅
需要兼容旧环境或保留函数时,用 Lodash cloneDeep
_.cloneDeep() 默认会丢弃 RegExp,但可通过 customizer 回调手动重建:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 检测
value instanceof RegExp,返回new RegExp(value.source, value.flags) - 额外赋值
lastIndex以还原匹配状态 - 若对象里还有函数、Symbol 或不可枚举属性,它也能一并处理
示例:
const copied = _.cloneDeep(original, (value) => {if (value instanceof RegExp) {
const re = new RegExp(value.source, value.flags);
re.lastIndex = value.lastIndex;
return re;
}
});
手写递归拷贝(轻量、可控、学习用)
适合不想引入依赖、又需精细控制的场景。核心是三步:
- 用
WeakMap缓存已拷贝对象,防循环引用 - 用
Object.prototype.toString.call(x)准确识别 RegExp(避免仅靠typeof) - 对 RegExp 实例:新建
new RegExp(x.source, x.flags),再设lastIndex
其他类型如 Date、Map、Set 也按同样逻辑分类处理,不遗漏。
不复杂但容易忽略

















