JS深拷贝拷贝的区别?
拷贝拷贝引用,共享内存
深拷贝拷贝实例,不共享内存
1. 浅拷贝:当一个对象拷贝另一个对象的数据时,只要一个对象的数据发生改变时,另一个对象的数据也会发生改变,因为浅拷贝拷贝的是引用的地址
实现方式:
ES6 Object.assign()与扩展运算符...,两者都是只有是多层时才是浅拷贝,如果是一层还是深拷贝
参数1:空对象 参数2:需要拷贝的对象
简单的赋值
3. 深拷贝:当一个对象拷贝另一个对象数据时,其中一个对象的数据发生改变时,不会影响另一个对象数据的改变
实现方法:
$.extend(),除了可以给jQuery对象添加
JSON.stringify()=>JSON.parse()
slice, concat
for
遍历,将值存在另一个变量中(当对象嵌套多层无能为力)
slice和concat这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝
- 浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存;
- 深拷贝(deep copy):复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var a = 25; var b = a; b = 10; console.log(a);//25 console.log(b);//10 //浅拷贝 var obj1 = { a: 10, b: 20, c: 30 }; var obj2 = obj1; obj2.b = 40; console.log(obj1);// { a: 10, b: 40, c: 30 } console.log(obj2);// { a: 10, b: 40, c: 30 } //深拷贝 var obj1 = { a: 10, b: 20, c: 30 }; var obj2 = { a: obj1.a, b: obj1.b, c: obj1.c }; obj2.b = 40; console.log(obj1);// { a: 10, b: 20, c: 30 } console.log(obj2);// { a: 10, b: 40, c: 30 } |
深拷贝是指复制对象的所有层级,实现方法
(1)通过递归实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | deepCopy(o) { if (o instanceof Array) { let n = []; for (let i = 0; i < o.length; ++i) { n[i] = deepCopy(o[i]); } return n; } else if (o instanceof Object) { let n = {} for (let i in o) { n[i] = deepCopy(o[i]); } return n; } else { return o; } } |
( 2) 通过JSON解析实现
1 2 | //把一个对象转成json字符串在转成json对象 JSON.parse(JSON.stringify(o)) |
浅拷贝的实现
1 2 3 4 5 6 7 8 9 10 11 12 | var json1 = {"a":"name","arr1":[1,2,3]} function copy(obj1) { var obj2 = {}; for (var i in obj1) { obj2[i] = obj1[i]; } return obj2; } var json2 = copy(json1); json1.arr1.push(4); alert(json1.arr1); //1234 alert(json2.arr1) //1234 |
本文作者:Mahmud(مەھمۇد)
本文链接:https://www.cnblogs.com/mahmud/p/10212799.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!