<script type="text/javascript">
var obj={
a:{
b:10
}
}
/////////////////////////////
function copy(obj){
if(typeof obj !=="object"){
return obj;
}
var newobj={};
for(var attr in obj){
newobj[attr]=copy(obj[attr]);
}
return newobj;
}
copy(obj);
///////////////////////
</script>
关于这个对象的深拷贝,要想把引用类型的数据完全复制,必须得在堆中重新开辟一块区域,在把数据放到重新开辟的区域内,关于这个例子,一开始newobj={}
是在堆中开辟了一块区域,然后把数据放到这个newobj
当中,但是obj
里面的a
也是一个引用类型,不应该是a={}
,再把obj
里面b
放到新开辟的a
中,这个递归函数
怎么把a
重新开辟指引的?代码里面也没出现啊,想了2天了,看了很多例子,还是没想明白,希望大家能帮助一下。多谢。。。
如果不考虑复杂函数这些东西的话,@小俞 的办法是很直接很简单的。
如果你想写递归函数,需要处理两个主要的问题,
1. 哪些类型需要递归拷贝,哪些不需要。
比如 Array,Object 这些是需要深拷贝的,其它的一般不需要。
2. 如果避免递归引用。
比如 a 引用了 b,b 的某一个属性又引用了 a,在深拷贝的时候就可能出现递归引用,就可能一直不断的拷贝下去直到堆栈溢出。目前在 JavaScript 里我还没发现有啥好办法可以处理。
虽然 ES6 的 Map 可以处理,但是 Map 本身貌似还是不能区分两个看起来一样,但实际不同的两个对象。比如
这句新建了对象去保存a