javascript - 关于JS的JSON对象递归深拷贝?
巴扎黑
巴扎黑 2017-04-10 18:02:27
0
2
283
<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天了,看了很多例子,还是没想明白,希望大家能帮助一下。多谢。。。

巴扎黑
巴扎黑

모든 응답(2)
小葫芦

如果不考虑复杂函数这些东西的话,@小俞 的办法是很直接很简单的。
如果你想写递归函数,需要处理两个主要的问题,

1. 哪些类型需要递归拷贝,哪些不需要。

比如 Array,Object 这些是需要深拷贝的,其它的一般不需要。

2. 如果避免递归引用。

比如 a 引用了 b,b 的某一个属性又引用了 a,在深拷贝的时候就可能出现递归引用,就可能一直不断的拷贝下去直到堆栈溢出。目前在 JavaScript 里我还没发现有啥好办法可以处理。

虽然 ES6 的 Map 可以处理,但是 Map 本身貌似还是不能区分两个看起来一样,但实际不同的两个对象。比如

var m = new Map();
var a = {};
var b = {};
m[a] = 1;
console.log(m[b]); // 1,不是 undefined
m[b] = 2;

console.log(m[a]);     // 2,不是 1
console.log(m[b]);     // 2
阿神
newobj[attr]=copy(obj[attr]);

这句新建了对象去保存a

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿