浅拷贝当使用JavaScript对数组进行操作时,如果我们只是简单地将其赋值给其他变量,那么我们只需要改变其中的任何一个,其他的也会随之改变,这导致了问题vararr=['aa','bb','cc'];vararr2=arr;arr2[0]='新人';console.log(arr);//输出'new','bb','cc'可以看出,当数组arr2被修改时,arr中的数据也会随之改变。这种直接赋值的方式就是浅拷贝现象。所以为什么?因为JavaScript的存储对象都是存储地址的,浅拷贝会导致arr和arr2指向同一个内存地址。大致示意图如下。所以当arr2中的数据被修改时,由于arr也指向这里,所以arr中的数据也被“修改”了。深拷贝一般是开辟一个新的内存地址,将原对象的每一个属性一个一个的拷贝过来。如下图,修改arr2中的数据时,由于arr和arr2的地址不同,所以arr的数据还是原来的。数组的深拷贝vararr=['aa','bb','cc'];vararr2=arr.slice(0);arr2[0]="新人";console.log(arr);///输出:数组的原始值:'aa','bb','cc'console.log(arr2);//output:newvalueofarray:'new','bb','cc'Json深拷贝使用JSON下的两种方法实现对象的深拷贝。varjson={a:12,b:5};varstr=JSON.stringify(json);//这里将json中的数据转成字符串保存varjson2=JSON.parse(str);//这里将字符串的内容“还原”成原来的“面子”console.log(json2);//Output{a:12,b:5}总结其实在js中进行深拷贝的方式有很多,比如如使用数组下的cancat方法;遍历Json,赋予新的对象等。补充以上只考虑纯数组或纯对象(json字符串)的情况。互相嵌套的时候确实有问题。查阅资料后发现一个函数functioncloneObject(obj,deep){if(obj===null||obj===undefined||typeof(obj)!=='object'){returnobj;}vardeep=!!deep;varcloned=null;if(obj.constructor===Array){if(deep===false)returnobj;cloned=[];for(variinobj){cloned.push(cloneObject(obj[i],deep));}returncloned;}cloned={};for(variinobj){cloned[i]=deep?cloneObject(obj[i],true):obj[i];}returncloned;}vararr=[1,3,5,{a:5}]varnewArr=cloneObject(arr,true);newArr[3].a=9console.log(arr,newArr)
