当前位置: 首页 > Web前端 > JavaScript

浅拷贝和深拷贝

时间:2023-03-27 16:32:01 JavaScript

赋值varo1={age:1,language:[1,[2,3],[4,5]],}varo2=o1o2.age=2o2.language[2]=[6,7]console.log(o1.age)//2console.log(o1.language)//[1,[2,3],[6,7]]浅拷贝方法一:撕裂函数shallowCopy(src){vardst={};for(varpropinsrc){if(src.hasOwnProperty(prop)){dst[prop]=src[prop];}}returndst;}方法二:Object.assign({},who)(object)varo1={age:1,language:[1,[2,3],[4,5]],}varo2=Object.assign({},o1)o2.age=2o2.language[2]=[6,7]console.log(o1.age)//1console.log(o1.language)//[1,[2,3],[6,7]]方法三:三重运算符(对象)varo1={age:1,language:[1,[2,3],[4,5]],}varo2={...o1}o2.age=2o2。language[2]=[6,7]console.log(o1.age)//1console.log(o1.language)//[1,[2,3],[6,7]]方法四:Array。prototype.concat()(数组)varo1=[1,[1,[2,3],[4,5]]]varo2=o1.concat()o2[0]=2o2[1][2]=[6,7]console.log(o1[0])//1console.log(o1[1])//[1,[2,3],[6,7]]方法五:Array.prototype。slice()(数组)varo1=[1,[1,[2,3],[4,5]]]varo2=o1.slice()o2[0]=2o2[1][2]=[6,7]console.log(o1[0])//1console.log(o1[1])//[1,[2,3],[6,7]]深拷贝方式一:JSON.parse(JSON.stringify())(array+object)withJSON.stringify将对象转换为JSON字符串,然后使用JSON.parse()将字符串解析为对象。生成一个新的对象,对象会新开一个栈,实现深拷贝varo1={age:1,language:[1,[2,3],[4,5]],}varo2=JSON.parse(JSON.stringify(o1))o2.age=2o2.language[2]=[6,7]console.log(o1.age)//1console.log(o1.language)//[1,[2,3],[4,5]]varo1=[1,[1,[2,3],[4,5]]]varo2=JSON.parse(JSON.stringify(o1))o2[0]=2o2[1][2]=[6,7]console.log(o1[0])//1console.log(o1[1])//[1,[2,3],[4,5]]方法二:手撕//定义检测数据类型函数函数checkedType(target){returnObject.prototype.toString.call(target).slice(8,-1)}//实现深度克隆---object/arrayfunctionclone(target){//判断数据类型copy//初始化变量result成为最终克隆出来的数据=[]}else{returntarget}//遍历目标数据for(letiintarget){//获取遍历数据结构中每一项的值。letvalue=target[i]//判断目标结构中的每个值是否存在object/arrayif(checkedType(value)==='Object'||checkedType(value)==='Array'){//Theobject/array嵌套在object/array中//继续遍历得到值result[i]=clone(value)}else{//得到的值是基本数据类型或者函数。结果[i]=值;}}returnresult}//定义检查数据类型的函数functioncheckedType(target){returnObject.prototype.toString.call(target).slice(8,-1)}//ImplementationDeepclone---object/arrayfunctionclone(target){//判断拷贝的数据类型//初始化变量result成为最终克隆的数据letresult,targetType=checkedType(target)if(targetType==='object'){result={}}elseif(targetType==='Array'){result=[]}else{returntarget}//遍历目标数据for(letiintarget){//获取每一项值。letvalue=target[i]//判断目标结构中的每个值是否存在object/arrayif(checkedType(value)==='Object'||checkedType(value)==='Array'){//Theobject/array嵌套在object/array中//继续遍历得到值result[i]=clone(value)}else{//得到的值是基本数据类型或者函数。结果[i]=值;}}返回结果}