深拷贝创建完全独立的新对象,所有嵌套层级均重新分配内存;浅拷贝仅复制顶层,引用类型仍共享内存。推荐优先使用structuredClone(),兼容性要求高时可用JSON序列化或Lodash的_.cloneDeep()。

JavaScript 中深拷贝对象,核心是创建一个与原对象完全独立的新对象,所有嵌套层级的属性都重新分配内存,修改新对象不会影响原对象。浅拷贝只复制第一层属性的值(对基本类型是值拷贝,对引用类型是地址拷贝),所以嵌套对象仍共享同一内存地址。
浅拷贝:只复制顶层,引用类型仍共用
浅拷贝后,如果原对象里有数组、对象、日期、正则等引用类型,新对象和原对象会指向同一块内存。改其中一方的嵌套内容,另一方也会变。
常见方法:展开运算符 {...obj}、Object.assign({}, obj)、数组的 slice()、concat()、[...arr] 典型问题示例:
const a = { name: 'Alice', info: { age: 25 } }; const b = { ...a }; b.info.age = 30; console.log(a.info.age); // 输出 30 —— 被意外改了
深拷贝:彻底隔离,各用各的内存
深拷贝递归遍历对象所有层级,对每个引用类型都新建实例,确保新旧对象完全无关。适合配置备份、状态快照、避免副作用等场景。
推荐方式(安全通用):使用结构化克隆(structuredClone()),支持大多数内置类型(对象、数组、Map、Set、Date、RegExp、ArrayBuffer 等),且能处理循环引用(现代浏览器及 Node.js 17.0+) 兼容性方案:JSON 序列化反序列化(JSON.parse(JSON.stringify(obj))),但不支持函数、undefined、Symbol、Date 对象(变成字符串)、RegExp、循环引用,且会丢弃原型链 自定义实现要点:需判断类型(null / 基本类型 / 引用类型 / 循环引用),用 WeakMap 记录已拷贝对象,避免无限递归
怎么选?看需求和环境
不需要支持老旧环境时,优先用 structuredClone();需要兼容 IE 或旧 Node 版本,且数据结构简单(纯 JSON 可序列化),可用 JSON.parse(JSON.stringify());若含函数、特殊对象或需精细控制,建议用 Lodash 的 _.cloneDeep() 或手写带循环检测的递归函数。
立即学习“Java免费学习笔记(深入)”;
基本上就这些。深拷贝不是“越深越好”,而是按需选择——能用浅拷贝解决的别硬上深拷贝,性能更优;真要隔离,就选靠谱、能覆盖你数据类型的方案。
以上就是javascript如何深度拷贝对象_浅拷贝和深拷贝的区别是什么?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1544207.html
微信扫一扫
支付宝扫一扫