JavaScript中引用类型拷贝的关键在于明确保留需求与接受代价:浅拷贝仅复制第一层引用,深拷贝则递归重建彻底隔离;JSON方案轻量但丢弃函数/Date/Map等,structuredClone是现代首选,手写递归最可控。

JavaScript 中引用数据类型(如对象、数组、Date、Map 等)的拷贝,关键不在“怎么写”,而在“你想保留什么、能接受什么代价”。基本类型(string/number/boolean 等)赋值天然独立,不存在深浅之分;真正要小心的,全是引用类型——因为它们在栈里存的是地址,不是数据本身。
浅拷贝:只管第一层,嵌套还共用
浅拷贝创建一个新对象或数组,但只复制第一层属性的值。对基本类型值,是真复制;对引用类型值(比如对象、数组),复制的是地址——新旧对象仍指向同一块堆内存。
- 适用场景:确定数据结构扁平、无嵌套,或仅需临时隔离顶层字段(如表单初始值快照)
-
常用方法:
Object.assign({}, obj)-
{...obj}(对象展开) -
arr.slice()、[...arr]、Array.from(arr)(数组)
-
典型陷阱:
const a = { x: 1, y: { z: 2 } }; const b = {...a}; b.y.z = 99;→a.y.z也变成 99
深拷贝:递归重建,彻底断开关联
深拷贝会遍历所有层级,为每个嵌套的引用类型创建全新实例,确保新对象与原对象内存完全隔离。修改任意一层,彼此互不影响。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
JSON 方法(简单但脆弱):
JSON.parse(JSON.stringify(obj))
✅ 快速支持普通对象/数组
❌ 丢弃undefined、function、Symbol;Date变字符串;RegExp变空对象;不支持Map/Set/BigInt/循环引用 -
structuredClone(现代首选):
structuredClone(obj)
✅ 原生支持Date、RegExp、Map、Set、ArrayBuffer和循环引用
❌ Chrome 98+/Firefox 94+/Safari 16.4+,老版本不兼容 -
手写递归(最可控):
用WeakMap缓存已处理对象防循环引用;按类型分别构造(Array.isArray、obj instanceof Date等);只遍历自身属性(Object.keys()或getOwnPropertyNames())
选哪个?看你的数据和环境
不需要万能方案,只选够用的:
立即学习“Java免费学习笔记(深入)”;
- 纯配置数据(无函数、无日期、无循环)→
JSON.parse(JSON.stringify())最轻量 - 项目支持现代浏览器且含复杂类型 → 直接用
structuredClone - 需兼容 IE 或老旧 Node.js,或数据结构特殊(如含原型方法、自定义类实例)→ 手写或引入
lodash.cloneDeep - 只是想避免子组件改父状态 → 先确认是否真需要深拷贝;有时用不可变更新(如
immer)更自然

















