核心是建立“内存地址”意识:值类型存值,赋值即复制;引用类型存地址,赋值仅复制钥匙;浅拷贝只换壳不换芯,嵌套引用仍共享;深拷贝递归挖到底,新旧对象完全独立。

学浅拷贝和深拷贝,核心不是背方法,而是建立“内存地址”意识——你改的到底是数据本身,还是那把指向数据的钥匙。
先搞懂底层:值类型 vs 引用类型
这是所有拷贝问题的起点:
- 基本类型(string/number/boolean/null/undefined/symbol/bigint):变量里存的是真实值,赋值就是复制一份新值,互不影响
- 引用类型(Object/Array/Date/RegExp/Function/Map/Set等):变量里存的是内存地址,赋值只是多给了一把钥匙,开的是同一个房间
没吃透这点,后面所有拷贝操作都容易误判。比如const a = {x: 1}; const b = a;,b根本不是副本,它和a共用同一块堆内存。
识别浅拷贝:只换壳,不换芯
浅拷贝创建了新对象,但只保证第一层独立;只要属性值是对象、数组等引用类型,里面还是共享的。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 常用方式:展开运算符
{...obj}、Object.assign({}, obj)、数组的slice()/concat()/[...arr] - 典型陷阱:修改嵌套字段会污染原对象,如
copy.user.profile.name = 'new'→ 原对象user.profile.name也变了 - 注意边界:
Object.assign不复制原型链和不可枚举属性;数组方法对元素仍是浅拷贝
掌握深拷贝:要真独立,就得递归挖到底
深拷贝的目标是让新旧对象彻底解耦,改一个完全不影响另一个。
-
JSON法(
JSON.parse(JSON.stringify(obj))):快、简、兼容好,但会丢函数、undefined、Symbol、循环引用、正则、Date等 - 手写递归:需处理基本类型判断、数组/对象区分、Date/RegExp特殊构造、WeakMap防循环引用、Symbol键遍历
-
工具库:Lodash 的
_.cloneDeep经过大量场景打磨,生产环境推荐优先使用
别迷信“一行解决”,关键看你的数据里有没有函数、时间、正则、循环结构——有就别用 JSON 法。
实战中怎么选:看结构,看需求,看风险
不是越“深”越好,而是够用且安全:
- 纯配置对象、扁平数据 → 浅拷贝足够,性能更好
- Redux/Vuex 状态更新、表单初始值隔离、组件 props 透传 → 必须深拷贝,避免副作用
- 不确定嵌套深度或含特殊类型 → 直接上
_.cloneDeep,省心又可靠 - 自己实现深拷贝时,务必加循环引用测试:
const a = {}; a.self = a;
真正踩过坑的人,往往不是不会写深拷贝,而是没想清楚“这里到底需不需要深”。










