JSON深拷贝不能保障Mock数据隔离,因会静默丢弃函数/undefined/Symbol、失真Date/Map/RegExp、循环引用报错;真正可靠的是模板冻结、按需生成、structuredClone或服务端Mock隔离。

深拷贝本身不能保证前端 Mock 数据的绝对隔离性,反而容易制造虚假安全感。真正可靠的隔离依赖的是不可变设计、运行时管控和架构分层,而非单纯复制数据。
JSON.stringify + parse 的陷阱
这是最常见也最危险的做法。它看似“复制了模板”,实则在关键场景下全面失效:
- 函数、undefined、Symbol、BigInt 字段被静默丢弃,mock 行为彻底丢失
- Date、RegExp、Map、Set 等类型被降级或失真(如 Date 变成字符串,Map 变成空对象)
- 存在循环引用时直接抛出 TypeError: cyclic object value,导致 mock 请求中断
- 无法还原原型链和特殊属性,后续 instanceof 或方法调用全部失败
比深拷贝更根本的隔离策略
核心思路是:不靠“复制”,而靠“冻结”和“按需生成”。
-
模板定义即冻结:创建模板后立即递归调用
Object.freeze(),阻断所有属性修改操作 -
响应阶段动态构造:把模板当作纯配置,每次请求时通过函数(如
createResponse(template, overrides))实时生成新对象,避免中间态长期持有 - 优先使用 structuredClone:现代浏览器支持该 API,能保留 Date、Map、Set、RegExp、BigInt 和循环引用,且不抛错,比 JSON 方案更接近真实深拷贝语义
- 服务端 Mock 层接管(推荐):前端只发标准请求,由本地 Mock 服务(如 MSW、Express 中间件)读取模板、生成响应并返回——原始模板从不进入前端 JS 执行环境
若必须用 JSON 方案,至少补三道防线
仅限兼容老浏览器且模板极简(纯 JSON-safe 结构)的临时场景:
立即学习“前端免费学习笔记(深入)”;
- 初始化时主动校验模板:遍历检测是否含函数、Date、undefined 等非法值,发现即报错提示
- 对已知字段做类型还原:例如识别时间字符串字段,手动 new Date() 替换
- 不在模板层拷贝,而在响应构造后做防御性处理:比如对返回体中的关键字段再次校验/重置
不复杂但容易忽略:Mock 隔离的本质不是“让副本像原样”,而是“让原样根本不可动”。

















