JSON深拷贝对RegExp失效,因JSON.stringify()将正则静默转为空对象{},导致source、flags丢失;应改用structuredClone()、手写递归(new RegExp(obj.source, obj.flags))或Lodash的_.cloneDeep()。

JSON 深拷贝对 RegExp 对象失效,是因为 JSON.stringify() 不支持正则表达式——它会把 /abc/g 直接转成空对象 {},再 JSON.parse() 回来就只剩一个普通空对象,原始的 source、flags 全部丢失。
为什么 JSON 无法保留 RegExp
RegExp 实例不是 JSON 可序列化类型。标准规定:只有字符串、数字、布尔、null、数组、纯对象(plain object)能被安全序列化。函数、Date、RegExp、Map、Set、undefined、Symbol 等都会被忽略或转换为无效值。RegExp 就属于“静默降级”:不报错,但信息归零。
常见错误写法及后果
直接用 JSON.parse(JSON.stringify({ re: /test/g })):
- 结果是
{ re: {} },不再是 RegExp 实例 -
cloned.re.test('test')报错:TypeError: cloned.re.test is not a function - 无法通过
instanceof RegExp判断
可行的替代方案
根据运行环境和需求选择:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
立即学习“Java免费学习笔记(深入)”;
-
现代浏览器/Node.js(Chrome 98+、Firefox 94+、Node.js 18.13+):优先用
structuredClone(),它原生支持 RegExp,完整保留source和flags -
需要兼容旧环境,或需完全控制逻辑:手写递归深拷贝,在遇到
RegExp时显式构造新实例:new RegExp(value.source, value.flags) -
项目已引入 Lodash:用
_.cloneDeep()配合customizer回调,检测到 RegExp 就返回重建结果
简易修复示例(手写递归片段)
在深拷贝函数中加入 RegExp 分支:
if (obj instanceof RegExp) {
return new RegExp(obj.source, obj.flags);
}
注意同步处理循环引用(用 WeakMap 缓存已克隆对象),否则带引用的正则上下文可能出问题。

















