1.概念
浅拷贝——只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
深拷贝——会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
2.Object.assign()
2.1.基本用法:
Object.assign(目标,数据1,数据2…);
//示例1 let obj = {a:1} let newObj = Object.assign({},obj); console.log(newObj) //{a: 1} //示例2 let obj1 = {name:"zhangsan"}; let obj2 = {age:18}; let obj3 = Object.assign({},obj1,obj2); console.log(obj3) //{name: "zhangsan", age: 18}
2.2.常规用法
2.2.1.Object.assign()方法的第一个参数是目标对象,后面的参数都是源对象,Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
var obj = {}; var o1 = { a: 1 }; var o2 = { b: 2 }; var obj = Object.assign(obj, o1, o2); console.log(obj); // { a: 1, b: 2 }
注意:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
const target = { a: 1, b: 1 }; const source1 = { b: 2, c: 2 }; const source2 = { c: 3 }; Object.assign(target, source1, source2); console.log(target); // {a:1, b:2, c:3}
Object.assign()
方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign()
进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。
var obj = { a: {a: "kobe", b: 39} }; var initalObj = Object.assign({}, obj); initalObj.a.a = "李世民"; console.log(obj.a.a); // 李世民
注意:当obj(源对象)只有一层的时候,是深拷贝
let obj = { username: 'kobe' }; let obj2 = Object.assign({},obj); obj2.username = '李世民'; console.log(obj);//{username: "kobe"}
2.2.2.Object.assign是浅拷贝还是深拷贝的问题
即:第一级属性深拷贝,从第二级属性开始就是浅拷贝。
//示例1 一层深拷贝 let obj = {a:1} let newObj = Object.assign({},obj); console.log(newObj); //{a: 1} newObj.a=2; console.log(obj); //{a:1} console.log(newObj); //{a: 2} //示例2 二层浅拷贝 let obj = {a:1,b:{name:"zhangsan"}} let newObj = Object.assign({},obj); console.log(newObj); //{a:1,b:{name:"zhangsan"}} newObj.b.name="lisi"; console.log(obj); //{a:1,b:{name:"lisi"}} console.log(newObj); //{a:1,b:{name:"lisi"}}
3.总结
1.用 JSON.stringify 把对象转换成字符串,再用 JSON.parse 把字符串转换成新的对象,但是需要注意的是,可以转成 JSON 格式的对象才能使用这种方法,如果对象中包含 function 或 RegExp 这些就不能用这种方法了。
2.Object.assign()拷贝当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
参考---https://blog.csdn.net/weixin_44867717/article/details/121121269
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2021-10-11 在vue项目中引入vue-router并使用
2021-10-11 关联本地代码的方式 HTTPS和SSH---Gitee码云
2020-10-11 axios POST提交数据的三种请求方式写法