首选 structuredClone(),它能正确处理 Date、Map、Set、循环引用等接口常见结构;兼容旧环境时用 lodash.cloneDeep;避免 JSON.parse(JSON.stringify()),因其丢失 Date 实例和 undefined。

处理后端接口返回的复杂嵌套对象深拷贝,关键不是“选最快的方法”,而是“选最稳的方案”——因为接口数据常含日期、数组、对象、null,偶尔还夹带 undefined 或空字段,但极少含函数、Symbol、Map、Set 或循环引用。所以得先看清数据特征,再定策略。
先确认接口数据的实际结构
别默认用 JSON.parse(JSON.stringify()),先打印原始响应看一眼:
- 有没有
Date实例?(后端通常只传 ISO 字符串,前端解析后才转 Date) - 有没有
null或undefined字段?(undefined在 JSON 中会被丢弃,若后端真返回了,说明它没走标准序列化流程) - 是否含
RegExp、Map、Set?(几乎不会——这些类型无法直接 JSON 序列化,后端不可能原样传) - 是否存在循环引用?(API 返回的数据结构基本是树形,极少出现自引用)
推荐优先使用 structuredClone()
现代浏览器(Chrome 98+、Firefox 94+、Safari 15.4+)已原生支持 structuredClone(),它能正确处理:
- Date、RegExp、ArrayBuffer、TypedArray、Map、Set、Error、Blob、File
- 嵌套对象和数组的完整层级
- 循环引用(自动识别并重建引用关系)
用法极简:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
注意:它不复制函数、undefined、Symbol —— 但接口数据本来就不该有这些,所以实际兼容性比 JSON 方法更好。
兼容旧环境时用 Lodash cloneDeep
如果需支持 IE 或老版 Android WebView,lodash.cloneDeep 是更稳妥的选择:
- 能保留 Date 对象(不是字符串)、正则表达式、稀疏数组等
- 自动检测并处理循环引用
- 对
undefined字段也按原值保留(而 JSON 方法会删掉)
引入方式(ESM):
import { cloneDeep } from 'lodash-es';const copy = cloneDeep(responseData);
慎用 JSON.parse(JSON.stringify())
它只适合“纯 JSON 可序列化”的场景,比如:
- 后端返回全是字符串/数字/布尔/null/普通对象/数组
- 你确定没有 Date 实例(或可接受转成字符串)
- 不需要保留
undefined(它会消失)
一旦响应里有 new Date() 或 undefined 字段,这个方法就会悄悄失真,调试时很难发现。

















