当前位置: 首页 > 后端技术 > Node.js

JS浅拷贝和深拷贝以及应用场景

时间:2023-04-03 13:54:37 Node.js

为什么要用浅拷贝和深拷贝先看下面的代码leta=b=2a=3console.log(a)console.log(b)letc=d=[1,2,3]lete=f={a:1,b:2,c:3}c[0]=2e.a=2console.log(d[0])console.log(f.a)你会发现当同一个Array或Object赋值给两个不同的变量时,变量指向同一个内存地址,所以会导致其中一个变量改变属性值,同时改变该变量对应的属性值其他变量。在大多数实际项目中,我们想要的结果是两个变量(初值相同)互不影响。所以需要用到copy(分深浅)。深拷贝和浅拷贝的区别。浅拷贝只拷贝一层对象的属性,而深拷贝递归拷贝所有层次。浅拷贝有效性适用于单级对象[1,2,3]或{a:1,b:2}深拷贝有效性适用于单级或多层对象[1,2,3]或{a:1,b:2}or[1,[1],{a:1}]or{a:[1],b:{c:2}}如何实现浅拷贝//arrayleta=[1,2]letb=a.slice()//{}lete={a:[1],b:{d:1},2}letf=Object.create(e)functionshallowCopy(obj){if(typeofobj==='object'&&obj!==null){if(Array.isArray(obj)){returnobj.slice()}else{letresult={}Object.keys(obj).forEach((item,i)=>{console.log(i)result[item]=obj[item]})returnresult}}else{returnobj}}应用场景想复制一份Array和Object,层结构使用Vue时mixin是复杂类型的浅拷贝如何实现深拷贝//使用JSON(它能正确处理的对象有Number,String,Boolean,Array,flatobjects)letg=JSON.parse(JSON.stringify(obj))//forfunctiondeepCopy(obj){if(typeofobj==='object'&&obj!==null){letobjKeys=Object.keys(obj)letresultif(Array.isArray(obj)){结果=[]}否则{我f(obj.constructor===Object){result={}}else{returnobj}}objKeys.forEach((item)=>{if(typeofobj[item]==='object'&&obj[item]!==null){switch(obj[item].constructor){caseArray:result[item]=deepCopy(obj[item])breakcaseObject:result[item]=deepCopy(obj[item])breakcaseDate:result[item]=newDate(obj[item])breakcaseRegExp:letattributes=''attributes+=obj[item].global?'g':''attributes+=obj[item].ignoreCase?'g':''attributes+=obj[item].multiline?'g':''result[item]=newRegExp(obj[item].source,attributes);打破默认:result[item]=obj[item]break}}else{result[item]=obj[item]}})返回结果}else{returnobj}}应用场景深拷贝对象数据结构深拷贝的应用思路实际工作中是不是用继承比较好?每个人都需要讨论和发表意见