javascript中浅拷贝仅复制对象第一层属性,基本类型值拷贝,引用类型仍共享地址;深拷贝则递归复制所有层级,新旧对象完全独立。

JavaScript对象拷贝不是“复制一下”那么简单,关键在于搞清你复制的是值,还是地址。基本类型(如数字、字符串)天然独立,改一个不影响另一个;而对象、数组这类引用类型,默认赋值只是复制了内存地址——改新对象,原对象跟着变。所以真正需要讨论“浅拷贝”和“深拷贝”的,只针对引用类型。
浅拷贝:只断开第一层引用
浅拷贝创建一个新对象,把源对象第一层的属性值直接复制过去。如果某个属性是基本类型,那就真·复制一份;如果是对象、数组等引用类型,复制的仍是那个地址——新旧对象在深层依然共用同一块内存。
-
对象展开运算符:
const copy = { ...origin };简洁直观,但仅限对象,不处理 Symbol 属性或不可枚举属性 -
Object.assign():
const copy = Object.assign({}, origin);支持多个源对象合并,同样只做一层复制 - Array.slice() / concat() / [...arr]:数组专用,对一维数组安全,但遇到嵌套数组或对象时,内部仍共享引用
深拷贝:彻底隔离所有层级
深拷贝递归遍历整个对象树,对每一层的引用类型都新建实例,确保新对象与原对象完全无关。修改任意一层,都不会波及对方。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
JSON 方法:
JSON.parse(JSON.stringify(obj))最快上手,但会丢函数、undefined、Symbol、Date、RegExp 等非 JSON 安全类型,也处理不了循环引用 - Lodash cloneDeep:生产环境首选,健壮全面,支持各种边界情况,包括 Map、Set、Date、RegExp 和循环引用
- structuredClone():现代浏览器(Chrome 98+、Firefox 94+、Safari 16.4+)原生支持,能正确克隆函数外的大多数内置类型(含 Map、Set、TypedArray、Date、RegExp),但不支持函数和 DOM 节点
怎么选?看数据结构和运行环境
没有银弹方案,得按需匹配:
- 单层配置对象、简单表单数据 → 浅拷贝足够,性能好又轻量
- 多层嵌套、含 Date/Map/Set 的业务数据 → 优先用
structuredClone(有兼容性兜底时)或 Lodash - 需要兼容老浏览器(如 IE)且结构可控 → 手写递归深拷贝,注意处理循环引用和特殊类型
- 临时调试或原型阶段快速验证 → JSON 方法够用,但务必确认数据不含函数或 undefined
避坑提醒:别被“看起来像复制”骗了
常见误区包括:以为 Object.assign({}, obj) 是深拷贝;在 React 中直接 push/splice 原数组再 set;或用扩展运算符解构后修改内层对象。这些操作表面新建了容器,但深层数据仍连着原内存。只要涉及嵌套对象或数组,就得问一句:“我改它,原数据会不会动?”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










