首页 > 其他 > 详细

Object的复制

时间:2020-05-13 12:58:22      阅读:45      评论:0      收藏:0      [点我收藏+]

以前学习的对象的复制方法:

 

        var obj={a:1,b:2};
        for(var prop in obj){
            o[prop]=obj[prop];
        }
        var obj={a:1,b:2};
        var o={c:1};
        //将{}对象中obj复制给o对象,重新设置了o的新的引用地址时obj复制并且赋值
        var o={...obj};
        obj.a=10;
        console.log(o===o1);

assign()

  ES6以后才有的方法

 

 

        将obj的所有属性复制到o的属性上
        Object.assign(o,obj);
        console.log(o);
 
 

        将obj对象的所有属性复制到一个空对象的属性上,并且返回这个空对象
        var o1=Object.assign({},obj);
        var o2={};
        var o3=Object.assign(o2,obj);
        console.log(o2===o3);
 
 
 
       Object.assign不能复制原型链属性
        var o6=Object.assign({},o4);
        console.log(o6);
 
        

        可以将多个对象的属性值复制到新对象中
        var obj={a:1,b:2};
        var o={c:1};
        var o7=Object.assign({},obj,o);
        console.log(o7);

        如果将多个对象复制到一个对象上时,如果有相同属性,
        后面的对象会覆盖前面对象的相同属性
        var obj={a:1,b:2};
        var o={c:1};
        var obj1={a:10,c:20,d:30};
        var obj2={c:100,d:70,e:50};
        var o8=Object.assign({},obj,obj1,obj2);
        console.log(o8);
 
 
        Object.assign不能复制原型链,不可枚举属性
        var arr=[1,2,3];
        var arr1=Object.assign([,,,5],arr);
        arr[0]=10;
        console.log(arr1);
 
深复制是对象当中的子元素、子对象和原来的对象都没有引用关系,而浅复制只有第一层有引用关系,以后各层都没有引用关系。
——————————————————到此为止我们学过3种复制对象的方法,但是这三种仅能作为浅复制
下面完成深复制
var o9=JSON.parse(JSON.stringify(obj));将对象变成字符串,再将字符串变为对象
 
 
分析:
var obj={
            a:1,
            b:2,
            c:{
                d:3,
                e:4,
 
            }
        }
 
 
 
这种只能浅复制,因为只遍历了第一层属性赋值。
        var o={};
         for(var prop in obj){
            o[prop]=obj[prop];
        }
        // obj.a=10;
        // obj.c.d=10;
        console.log(o);
 
 
 
这种 完成了一种浅复制
        var o={...obj};
        obj.c.d=10;
        console.log(o);
 
 
 这个也是浅复制
        var o=Object.assign({},obj);
        obj.c.d=10;
        console.log(o);
 
 
这个是深复制,但是不可枚举属性和方法都无法进行复制
        var o=JSON.parse(JSON.stringify(obj));
        obj.c.d=10;

        console.log(o);
原因:将obj的每一层全部都转换为字符串,因此将   obj.c.d=10;时,o结果的c的结果没有发生改变,已经将obj变成了字符串,然后再将字符串生成了新的对象,和原来的对象没有引用关系
 
 
但是这样做深复制也是不好的,不可美剧属性和方法都不能进行复制
举例:
  var obj={
            a:1,
            b:2,
            c:{
                d:3,
                e:4,
                f:function(){
                    console.log("aaa");
                }
            }
        }
 
 
 var o=JSON.parse(JSON.stringify(obj));
        obj.c.d=10;

        console.log(o);
 
运行结果:c当中少了一个f的方法。
 
 

Object的复制

原文:https://www.cnblogs.com/wjsblog/p/12880978.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!