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

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}];

    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、结束语:

   对象数组,数组对象在实际应用中非常有用;有问题欢迎吐槽,记得点赞哦。

    

    




   



猜你喜欢

转载自blog.csdn.net/yaomengzhi/article/details/79578598