优先选structuredClone(),它语法简洁、性能好、支持多种类型且自动处理循环引用;若需兼容旧浏览器,则用手动递归实现;JSON方法仅适用于纯对象或数组等简单场景。

选哪个,取决于你项目里实际要拷贝的数据长什么样、跑在什么环境、对性能和健壮性分别有多在意。
如果你的数据只是纯对象或数组,没有函数、日期、正则、undefined、Symbol,也不含循环引用
JSON 方法够用,而且写起来最轻量:
-
代码就一行:
JSON.parse(JSON.stringify(obj)) - 兼容性好,老浏览器也支持
- 执行快——尤其数据结构扁平、字段不多时
但要注意:哪怕只多一个 Date 实例,它就会变成字符串;undefined 直接被丢掉;RegExp 变成空对象;遇到循环引用直接报错。
如果你的数据来自用户输入、配置文件或后端接口,类型不可控
手动递归(或基于它的封装)更稳妥:
- 能识别并正确复制
Date、RegExp、Map、Set、ArrayBuffer等原生类型 - 可加入循环引用检测,避免栈溢出或无限递归
- 支持自定义类实例(只要显式处理 constructor 和自有属性)
代价是代码变长、运行时判断增多,深度太大时调用栈压力明显。不过多数业务场景下,几百层嵌套已属极端,实际影响有限。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
别忘了现代浏览器的原生方案
structuredClone() 是目前最平衡的选择:
- 语法极简:
structuredClone(obj) - 性能接近 JSON 方法,但支持类型远超它(含
Map、Set、Date、RegExp、TypedArray等) - 自动处理循环引用,不抛错
- 缺点是 IE 和部分旧版 Safari 不支持(2026 年主流环境基本已覆盖)
如果项目目标环境明确支持,优先用它;否则 fallback 到递归实现,比硬上 JSON 更可靠。
高频调用且结构固定时,可以考虑预编译
比如日志模板、表单默认值这类重复结构,不必每次运行时判断类型:
- 提前生成专用拷贝函数(用
Proxy或代码生成) - 跳过类型检查,只复制已知字段
- 性能提升明显,适合性能敏感模块
但这属于进阶优化,多数项目用不上。

















