js的深复制和浅复制

在弄项目的时候我们可能会遇到将一个对象复制给另外一个对象的情况,对象的复制不像基本类型那样简单的进行复制,因为对象是保存的堆内存中,如果只是简单的复制的话,如果其中一个对象的属性改变了,会造成另外一个对象的属性也会跟着改变,这是不允许出现的,这里介绍对象复制的几种情况:

1.对象是数组的情况

如果已经确定了是数组对象,那么可以直接使用数组的一些特有属性,例如slice,concat等等,因为它们只是返回一个数组的副本,不会改变原数组

例如:

arr=[1,2,3,4]

arr1=arr.slice(0);

arr1.push(5);

console.log(arr) .........[1,2,3,4];

 

2.对象里面既有基本类型也有数组类型的情况

这个可以分为两种情况,深复制和浅复制

 

深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用

1)深复制在计算机中开辟了一块内存地址用于存放复制的对象,
2)而浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。

所谓的浅复制,只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”。

看看浅复制

var json1 = {"a":"李鹏","arr1":[1,2,3]}
function copy(obj1) {     
       var obj2 = {};
   for (var i in obj1) {       
                obj2[i] = obj1[i];     
           }     
          return obj2;
}
var json2 = copy(json1);
json1.arr1.push(4);
alert(json1.arr1); //1234
alert(json2.arr1) //1234对于数组部分还是引用了
 
再看看深复制

而深复制的话,我们要求复制一个复杂的对象,那么我们就可以利用递归的思想来做,及省性能,又不会发生引用。

var json1={"name":"鹏哥","age":18,"arr1":[1,2,3,4,5],"string":'afasfsafa',"arr2":[1,2,3,4,5],"arr3":[{"name1":"李鹏"},{"job":"前端开发求职"}]};
var json2={};
function copy(obj1,obj2){
       var obj2=obj2||{}; //最初的时候给它一个初始值=它自己或者是一个json
       for(var name in obj1){
            if(typeof obj1[name] === "object"){ //先判断一下obj[name]是不是一个对象
                  obj2[name]= (obj1[name].constructor===Array)?[]:{}; //我们让要复制的对象的name项=数组或者是json
                 copy(obj1[name],obj2[name]); //然后来无限调用函数自己 递归思想
            }else{
                  obj2[name]=obj1[name]; //如果不是对象,直接等于即可,不会发生引用。
            }
        }
       return obj2; //然后在把复制好的对象给return出去 }
json2=copy(json1,json2)
json1.arr1.push(6);
alert(json1.arr1); //123456
alert(json2.arr1); //12345

详细地址可以看看:http://www.jianshu.com/p/0d7bd31ccf43
 

 

posted @ 2017-08-31 16:10  十nian  阅读(178)  评论(0编辑  收藏  举报