zoukankan      html  css  js  c++  java
  • 深拷贝和浅拷贝

    1.浅拷贝
    指的是拷贝一个对象的时候,仅仅拷贝对象的内存地址,如果原来的对象发生变化的话,那通过浅拷贝的对象也会发生变化.也就是说基板还在,只是简单的复印(以前别人叫你小王,后来叫你老王,但是你还是你,以前没有女朋友,现在还是没有女朋友);
    浅拷贝的方法:

    ①通过'='赋值
    var a = [1,2,3,4];
    var b = a;
    b[2] = 2;
    console.log(a+','+b)
    //1,2,2,4 , 1,2,2,4

    当b中的值发生变化的时候,a的值也在跟随着变化

    ②通过slice 对于一维数组来说比如

    var a = [1,2,3,4];
    var b = a.slice(0);
    b[2] = 2;
    console.log(a+"&"+b);
    //1,2,3,4&1,2,2,4 

    这个能够会返回一个新的数组实例,只是复制了引用,并不是深拷贝

    ③ 通过concat

    var a = [1,2,3,4];
    var b = a.concat();
    b[2] = 2;
    console.log(a+"&"+b);
    //1,2,3,4&1,2,2,4

    这个能够会返回一个新的数组实例,只是复制了引用,并不是深拷贝

    对于②,③这种情况 如果数组中存在对象的话,就不会是像原来的样子;for example:

    var a = [1,2,3,{name:'shuaige'}];
    //var b = a.slice(0);
    var b = a.concat();
    b[3].name = 'shoushou';
    console.log(a[3].name+"&"+b[3].name);
    //shoushou&shoushou

     b中的发生变化的时候,a的也会发生变化

    2.深拷贝
    指的是复制一个对象的时候,复制的不仅仅是内存地址.举个栗子,你老婆生了个儿子,虽然拷贝了你的优秀基因,但是你和你儿子是相互独立的,你是三十岁找到的女朋友结婚,你儿子可能18就找到女朋友结婚了.你的结婚年龄不会影响你儿子的结婚年龄.

    ① 通过JSON.parse(JSON.stringify()) 来进行深拷贝

    var x = {
        a: 1,
        b: { e: { f: 1 } },
        c: [ 1, 2, 3 ]
    };
    var y = JSON.parse(JSON.stringify(x));
    y.b.e.f = 2;
    console.log(x.b.e.f); //1

    ② 通过jquery 的extend

    var a= {
       x: 1,
       y: 2,
       n: [1,2,3,4],
       m: { aa: { bb : 23 } }
    }
    var dd = $.extend({} , a);
    var ee = $.extend(true , {} , a);
    当改变dd中的值的时候,a的值也会发生变化;
    当改变ee中的值的时候,a的值不会发生变化;
  • 相关阅读:
    Aizu 0033
    Aizu 0118
    【思维】贪心+细节——cf1361B
    【思维】构造+凸包+向量叉积——LEETCODE 游乐园的迷宫
    【思维】三元环计数+鸽笼定理/贪心——LEETCODE 游乐园的游览计划 好题
    dp+线性筛——LEETCODE切分数组
    【经典】带障碍的铺砖块——LEETCODE 覆盖
    【思维】树形dp+构造——leetcode二叉树任务调度
    【思维】状压dp—— 2020 联想杯 M
    【思维】建图+排列组合+预处理+最短路—— 2020 联想杯 E
  • 原文地址:https://www.cnblogs.com/Super-Zhen-/p/9102829.html
Copyright © 2011-2022 走看看