javascript中深浅拷贝的核心区别在于:浅拷贝只复制第一层属性,嵌套引用类型仍共享堆内存地址,修改深层属性会影响原对象;深拷贝则递归复制所有层级,新旧对象完全隔离。基本类型因存储在栈中、直接值拷贝,故无深浅之分。

JavaScript 中引用类型(如对象、数组、Date、RegExp 等)的拷贝行为,核心区别在于:是否复制了「堆内存中实际数据」本身,还是只复制了「指向该数据的地址」。这个差异直接决定修改新对象时,原对象会不会被连带影响。
浅拷贝:只复制第一层,子对象仍共用地址
浅拷贝创建一个新对象,但对其中的引用类型属性,只是把它们的内存地址复制过去——新旧对象在深层结构上依然指向同一块堆内存。
- 典型方法:Object.assign({}, obj)、{...obj}(展开运算符)、arr.slice()、[...arr]、Array.from(arr)
- 关键表现:修改新对象的一级属性(如字符串、数字)不影响原对象;但修改嵌套对象或数组的属性(如 obj2.nested.name = 'xxx'),原对象会同步变化
- 适用场景:临时解构、合并配置、避免直接修改传入参数的一级结构
深拷贝:递归复制所有层级,彻底隔离数据
深拷贝会逐层遍历,遇到引用类型就新建对应结构并复制内容,确保新对象与原对象在内存中完全独立,互不干扰。
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
-
常见实现:
- JSON 方法(简单但有局限):
JSON.parse(JSON.stringify(obj))—— 不支持函数、undefined、Symbol、Date、RegExp、循环引用 - 结构化克隆 API(现代推荐):
structuredClone(obj)—— 原生支持大多数类型,包括 Map、Set、Date、RegExp、嵌套对象,且能处理循环引用(Chrome 98+、Firefox 94+、Safari 16.4+) - 第三方库:
_.cloneDeep(obj)(Lodash)—— 兼容性好,功能全面
- JSON 方法(简单但有局限):
- 注意点:手写递归深拷贝需主动判断类型(Array/Object/Date/RegExp等),并处理循环引用,否则容易栈溢出
为什么基本类型不谈深浅?
Number、String、Boolean、null、undefined、Symbol、BigInt 这些基本类型都存在栈内存里,赋值或拷贝时直接复制值本身。所以不存在“共享地址”问题,也就没有浅深之分——每次都是天然的“深效果”。
怎么快速判断用了哪种拷贝?
改完新对象后,看原对象是否被影响:
- 如果只改一级属性(如
copy.name = 'new')原对象没变 → 是浅拷贝(正常) - 如果改了嵌套属性(如
copy.detail.age = 30)原对象的detail.age也变了 → 确认是浅拷贝 - 无论改哪一层,原对象始终不变 → 深拷贝生效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










