JavaScript实现浅拷贝与深拷贝的方法分析
本文实例讲述了JavaScript实现浅拷贝与深拷贝的方法。分享给大家供大家参考,具体如下:
平时使用数组复制时,我们大多数会使用‘=',这只是浅拷贝,存在很多问题。比如
letarr=[1,2,3,4,5]; letarr2=arr; console.log(arr)//[1,2,3,4,5] console.log(arr2)//[1,2,3,4,5] arr[0]=6; console.log(arr)//[6,2,3,4,5] console.log(arr2)//[6,2,3,4,5] arr2[4]=7; console.log(arr)//[6,2,3,4,7] console.log(arr2)//[6,2,3,4,7]
很明显,浅拷贝下,拷贝和被拷贝的数组会相互受到影响。所以,必须要有一种不受影响的方法,那就是深拷贝。
深拷贝的实现方式有很多种。
一、for循环实现深拷贝
//for循环copy functioncopy(arr){ letcArr=[] for(leti=0;i二、slice方法实现深拷贝
//slice实现深拷贝 letarr5=[1,2,3,4]; letarr6=arr5.slice(0); arr5[0]=5; console.log(arr5);//[5,2,3,4] console.log(arr6);//[1,2,3,4]三、concat实现深拷贝
//concat实现深拷贝 letarr7=[1,2,3,4]; letarr8=arr7.concat(); arr7[0]=5; console.log(arr7);//[5,2,3,4] console.log(arr8);//[1,2,3,4]四、es6扩展运算实现深拷贝
//es6扩展运算实现深拷贝 letarr9=[1,2,3,4]; let[...arr10]=arr9; arr9[0]=5; console.log(arr9)//[5,2,3,4] console.log(arr10)//[1,2,3,4]五、对象的循环深拷贝
//循环copy对象 letobj={ id:'0', name:'king', sex:'man' } letobj2=copy2(obj) functioncopy2(obj){ letcObj={}; for(varkeyinobj){ cObj[key]=obj[key] } returncObj } console.log(obj)//{id:"0",name:"king",sex:"man"} console.log(obj2)//{id:"0",name:"king",sex:"man"}六、对象转换成json实现深拷贝
//转换成json letobj3=JSON.parse(JSON.stringify(obj)); console.log(obj3)//{id:"0",name:"king",sex:"man"}七、es6扩展运算实现深拷贝
let{...obj4}=obj console.log(obj4)//{id:"0",name:"king",sex:"man"}八、通用深拷贝
varclone=function(v){ varo=v.constructor===Array?[]:{}; for(variinv){ o[i]=typeofv[i]==="object"?clone(v[i]):v[i]; } returno; }总结:深刻理解javascript的深浅拷贝,可以灵活的运用数组,并且可以避免很多bug。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。