浅拷贝仅复制对象第一层,引用类型仍共享内存地址,修改嵌套内容会影响原对象;深拷贝递归复制所有层级,完全隔离内存,任意修改互不影响。

浅拷贝和深拷贝的核心区别,就落在“内存地址是否共享”上。不是看复制了多少层,而是看修改嵌套内容时,原对象会不会跟着变。
浅拷贝:只新开一层壳,里头还共用老地方
浅拷贝会为新对象分配一块新的内存空间,但仅限于对象自身这一层。如果属性是基本类型(如 number、string、boolean),值被真正复制一份;如果属性是引用类型(如对象、数组、Date、RegExp),拷贝的只是那个地址——新旧对象的该属性仍指向同一块堆内存。
- 改基本类型字段:互不影响(比如 obj1.name = "张三" 不会影响 obj2.name)
- 改引用类型字段的内容:会相互影响(比如 obj1.list.push(4),obj2.list 也多出一个 4)
- 常见方式:Object.assign()、展开运算符 {...obj}、Array.prototype.slice()、Array.from()
深拷贝:从外到里,全搬新家
深拷贝会递归遍历整个对象树,对每一层的引用类型都开辟全新的内存空间,生成完全独立的副本。原始对象和拷贝对象之间没有任何共享的堆内存地址,因此任意一方的任何修改,都不会波及另一方。
- 改任意层级的字段(包括 obj1.user.profile.avatar.url):两边彻底隔离
- 注意边界:函数、undefined、Symbol、循环引用、DOM 节点等通常无法被通用深拷贝方法处理
- 常见方式:JSON.parse(JSON.stringify(obj))(有局限)、structuredClone()(现代浏览器支持)、第三方库如 Lodash 的 _.cloneDeep()
一句话抓住本质
浅拷贝是「表面复制」——新对象和原对象在第一层是两个地址,但从第二层开始可能手拉手站在同一个内存格子里;深拷贝是「彻底分家」——从顶层到底层所有引用,全都各自落座、互不串门。

















