浅拷贝复制对象第一层属性,引用类型共享内存地址,修改嵌套对象会影响原对象,常用方法有Object.assign、扩展运算符等;深拷贝递归复制所有层级,生成完全独立的新对象,修改副本不影响原对象,但性能开销大,可用JSON.parse(JSON.stringify())或_.cloneDeep()实现,后者更灵活且支持复杂类型。

JavaScript中的深拷贝和浅拷贝主要涉及对象和数组的复制行为。当你复制一个引用类型(如对象或数组)时,如果不小心,修改副本可能会影响原始数据。理解两者的机制有助于避免这类问题。
浅拷贝:只复制第一层属性
浅拷贝创建一个新对象,但其属性如果是引用类型,仍然指向原来的内存地址。
这意味着:
基本类型值被真实复制 引用类型值仅复制引用指针 修改嵌套对象会影响原对象
常见的浅拷贝方法包括:
立即学习“Java免费学习笔记(深入)”;
Object.assign({}, originalObj)
{…originalObj}
Array.prototype.slice() 或 Array.from(arr)
示例:
const original = { name: 'Alice', info: { age: 25 } };const shallow = Object.assign({}, original);shallow.info.age = 30;console.log(original.info.age); // 输出 30,原对象被影响
深拷贝:完全独立的副本
深拷贝会递归复制对象的所有层级,生成一个与原对象完全无关的新对象。
特点:
所有嵌套对象和数组都被重新创建 修改副本不会影响原对象 性能开销更大,尤其对复杂结构
实现方式有多种:
JSON.parse(JSON.stringify(obj)) — 简单但有限制
结构化克隆(Structured Clone) — 浏览器原生支持部分场景
递归函数手动实现 — 最灵活
使用库如 Lodash 的 _.cloneDeep()
注意:JSON方法无法处理函数、undefined、Symbol、循环引用等。
const original = { data: [1, { x: 1 }] };const deep = JSON.parse(JSON.stringify(original));deep.data[1].x = 99;console.log(original.data[1].x); // 输出 1,原对象不受影响
如何选择拷贝方式
根据实际需求决定使用哪种方式:
如果对象只有一层基本类型属性,浅拷贝足够 需要完整隔离数据时用深拷贝 存在函数、日期、Map/Set 等特殊类型时,慎用 JSON 方法 性能敏感场景避免频繁深拷贝大对象
基本上就这些。掌握拷贝机制的关键是理解引用传递的本质,根据数据结构复杂度选择合适方案。
以上就是JavaScript深拷贝与浅拷贝机制的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1531743.html
微信扫一扫
支付宝扫一扫