您的位置:首页 > 其它

关于对象,对象数组,数组,数组对象直接拷贝、浅拷贝、深拷贝问题的总结

2018-03-16 14:49 344 查看
1、对象、对象的数组或者对象的对象(两者同理)
     直接拷贝:将一个对象直接复制(拷贝)给另外一个对象,当一个对象改变时,则另一个对象则也会被改变,因为两个对象总的变量指向的是内存中同一位置。
    举例说明:
    let obj1 = {id: 1,value: 1,steps:[]};
    let obj2 = obj1;
    obj2.id = 2;
    console.log(obj1);//{id: 2,value:1}
    obj1.value = 2;
    console.log(obj2);//{id: 2,value:2}
   对象浅拷贝:只拷贝对象的一层,仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象;浅拷贝的方法有Jquery提供的$.extend(); 或者ES6+提供的Object.assign(target,source)(这个使用的方法);
     let obj1 = {id: 1,value: 1,steps:[]};
     let obj2=Object.assign({},obj1) 或者
     let obj2 = {};
     Object.assign(obj2,obj1)
//改变对象中的基本变量,两个对象中的值没有改变
     obj1.id = 2;
     console.log(obj2);//{id: 1,value: 1,steps:[]}
     obj2.value = 2;
     console.log(obj2) ;//{id: 1,value:2,steps:[]};
//当改变对象中的数组时,两个对象值都会被修改,因为他们指向同一内存位置
    obj1.steps = [1,2,3];
    console.log(obj2.steps); //[1,2,3] ;
   或者
    let steps = obj1.steps;//注意数组的拷贝问题,下面会细说
    steps[0] = 2; //steps = [3,3,3](这样赋值表现形式也会不一样喔,这个是数组拷贝问题,steps指向了一个新内存地址)
   console.log(obj1.steps); //[2,2,3]
   console.log(obj2.steps);//[2,2,3]
  对象深拷贝:将拷贝对象所引用的对象全部复制一遍,所有引用指向了一个新的内存地址;实现方法:$.extend([deep],target,object1,object2[,objectN])
  举例说明:
      let obj1 = {id: 1,value:1,steps:[]};
      let obj2 = $.extend(true,{},obj1);
      obj1.steps = [1,2,3];
      console.log(obj2);//{id:1,value:1,steps:[1,2,3]}
2、数组、数组对象的浅拷贝,深拷贝;(原理与对象拷贝一样)
     浅拷贝:将数组值直接赋值给另外一个数组;
      举例说明:简单的数组
      let a = [1,2,3,4];
      let b = a;
      a[4] = 5;
     console.log(b);//[1,2,3,4,5]
     b.pop();
     console.log(a);[1,2,3,4];
  //定义一个数组对象
    let a = [{id: 1,value:1}];
   let b = a;
    let node = a[0];//数组的对象被修改,则数组也会被修改,对象的拷贝请看上面如何操作
   node.id = 2,
    node.value = 2;
   console.log(a); //[{id: 2,value: 2}]
   //另外一直情况请思考
    let a = [{id:1,value: 2}];
   
4000
let b = [];
   for(let node of a){
        b.push(node);
}
a[0].id = 2;
a[0].value = 2;
console.log(b);//b的值是多少?

   深拷贝:定义一个新数组,将需要复制的数组成员重复赋值给另外一个数组;
    举例说明:简单数组的拷贝,可以用数组的操作方法实现拷贝,.slice()  .concat();
     let a = [1, 2 ,3, 4];
     let b = [];
     for(let node of a) {
         b.push(node);
      }//或者 b = a.slice(a) b = a.concat();
     a.push(5);
      console.log(a);//[1,2,3,4,5]
     console.log(b);//[1,2,3,4];//a b 指向不同的新内存位置,所以,如果a 或者b 改变不会影响对方;
     //数组对象的拷贝不能使用上面的方法
let a = [{id: 1,value:1}];
let b = [];
for(let node of a) {
let node2 = $.extend(true,{},node);/这里使用对象深拷贝,浅拷贝不起作用
b.push(node2);
}
a[0].id = 2;
a[0].value = 2;
console.log(b); //[{id: 1,value:2}]3、结束语:
   对象数组,数组对象在实际应用中非常有用;有问题欢迎吐槽,记得点赞哦。
    
    

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐