JSON.parse(JSON.stringify(obj))能实现浅层深拷贝但存在严重缺陷:会丢失函数、undefined、Symbol,将Date转为字符串,忽略RegExp/Map/Set等,且不支持循环引用;仅适用于纯POJO场景。

JSON 方法(JSON.parse(JSON.stringify(obj)))确实能实现深拷贝,但**它不是通用、安全或高性能的深拷贝方案**,尤其在性能敏感或数据结构复杂的场景下需谨慎使用。
适用场景有限,不处理特殊类型
该方法会丢失函数、undefined、Symbol、Date 对象(转成字符串)、RegExp、Map、Set、BigInt、循环引用等。例如:
-
JSON.stringify({ a: () => {} })→"{}"(函数被忽略) -
JSON.stringify(new Date())→"2024-01-01T00:00:00.000Z"(变成字符串,不再是 Date 实例) - 遇到循环引用直接报错:
TypeError: Converting circular structure to JSON
性能表现:快但有前提
在纯 POJO(Plain Old JavaScript Object),即只含 null、boolean、number、string、array 和普通 object 的扁平或中等嵌套结构下,JSON 方法往往比大多数手写递归或结构化克隆快 2–5 倍,因为它底层由引擎高度优化。
- 优势:无 JS 层递归开销,V8 等引擎对
JSON.stringify+JSON.parse有深度优化 - 劣势:序列化/反序列化过程需内存分配和字符串中间表示,对象越大,内存占用越高,GC 压力越明显
- 实测(10 万字段简单对象):JSON 方案约 8–12ms;结构化克隆(
structuredClone)约 15–20ms;LodashcloneDeep约 30–50ms
替代方案更可靠
现代开发中推荐按需选择:
立即学习“Java免费学习笔记(深入)”;
- 浏览器环境且支持较新标准 → 用
structuredClone():支持 Map/Set/Date/RegExp/Blob 等,性能接近 JSON 方法,且无数据丢失 - 需要兼容旧环境或定制行为 → 用成熟库如
lodash.cloneDeep或fast-deep-equal配合手动克隆逻辑 - 已知数据极简(如配置对象、API 响应 DTO)→ 可继续用 JSON 方法,但务必加类型校验和兜底处理
测试建议:别只看平均耗时
真实性能受数据特征影响极大:
- 测试时应覆盖不同嵌套深度、属性数量、值类型组合(尤其含 Date/RegExp 等)
- 关注内存峰值(Chrome DevTools Memory tab),JSON 方法易触发大字符串分配
- 注意首次运行(JIT 预热)与多次运行差异,避免单次测量误导
- Node.js 中可结合
process.memoryUsage()和console.time()综合评估
不复杂但容易忽略:JSON 深拷贝是“取巧”而非“解法”,适合临时、可控、轻量的场景,生产环境关键路径建议优先考虑语义正确性,再优化性能。



















