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的值不会发生变化;
  • 相关阅读:
    构建简单的二叉树(C)
    C指針淺析(3)
    C語言函數
    C# 細節(2)
    如何做好软件架构设计
    C# 細節(1)
    .NET Framework格式化字符串
    Windows下通过删除硬盘分区直接强行移除Fedora后恢复Windows启动项的方法
    DreamWeaver使用技巧学习心得
    MyEclipse使用心得、快捷键、设置
  • 原文地址:https://www.cnblogs.com/Super-Zhen-/p/9102829.html
Copyright © 2011-2022 走看看