深拷贝和浅拷贝

作者: ferrint | 来源:发表于2017-02-27 10:29 被阅读8次
  • 深拷贝:复制多层
  • 浅拷贝:复制一层

在JavaScript使用过程中我们经常会遇到这样的场景;

    var a = [1,2,3,4];
    var b = a;
    b[2] = 'other';
    console.log(a);   // [1,2,'ohher',4];

我们发现,当数组b的某一项发生变化时,数组a对应的项也发生了改变。

解析:当我们把变量a的值赋给变量b的时候,变量b只是复制了a的指针,在堆内存中,变量a和变量b其实指向了同一个存储区域。

那么怎么才能实现把a拷贝一份给b,当b变化时a不受影响呢?

    var arr = [1,["a","b"],3];
    //var arr1 = arr.slice(0);   // 与concat方法等效
    var arr1 = arr.concat();
    arr1[1][1] = "c";
    arr1[3] = "4"
    console.log(arr);       //[1,["a","c"],3]
    console.log(arr1);     //[1,["a","b"],3,4]

通过上面的例子,我们发现,给数组添加slice或concat方法,实现了一层拷贝,既一维数组的值实现了拷贝,二维数组还是受影响,也就是没实现拷贝,这种情况通常称为浅拷贝

那么又怎么实现深拷贝呢,我们这通过一个对象来演示?

    var a = {
        name : {age:100}
    };
    var str = JSON.stringify(a);
    var b = JSON.parse(str);
    b.name = {age:200};
    console.log(a.name.age);  //100 不受影响

当b的age发生变化时,a中的age并不会受影响,这样我们就实现了深拷贝,这种方法也是现在比较流行的一种做法,但是IE下会有一些兼容性问题( IE低版本不认识JSON.stringify() ),所以我们通过封装函数的方法,重新实现一遍深拷贝和浅拷贝:

  • 我们先建立一个对象
        var obj = {
            a:{
                aa:10
            },
            b: 20
        }
  • 用for...in实现对象下面每个属性的拷贝
  // 浅拷贝
    function shallowCopy(obj) {
        var newObj = {}
            for(var attr in obj){
                newObj[attr] = obj[attr]
            }
            return newObj;
        }
        var obj2 = shallowCopy(obj);
        obj2.b = 21;  
        obj2.a.aa = 11;
        console.log(obj.b);     //20 不受影响
        console.log(obj.a.aa);  //11 受影响
  • 用递归实现对象下面所有属性的拷贝
     // 深拷贝
        function deepCopy(obj){
            if(typeof obj != 'object'){
                return obj;
            }
            var newObj = {}
            for(var attr in obj){
                newObj[attr] = deepCopy(obj[attr]);
            }
            return newObj;
        }
        var obj2 = deepCopy(obj);
        obj2.b = 21;  
        obj2.a.aa = 11;
        console.log(obj.b);     //20 不受影响
        console.log(obj.a.aa);  //10 不受影响

鉴于时间紧迫没有仔细说明,以后有改动时在好好整理!

相关文章

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • copy和mutableCopy的区别

    copy和mutableCopy的区别 深拷贝和浅拷贝的区别 在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝 Objective-C中的浅拷贝和深拷贝

  • JavaScript的深拷贝和浅拷贝

    原文 博客原文 大纲 前言1、对深拷贝和浅拷贝的初步认识2、深拷贝和浅拷贝的区别3、浅拷贝存在的缺陷4、深拷贝的实...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

网友评论

    本文标题:深拷贝和浅拷贝

    本文链接:https://www.haomeiwen.com/subject/bppawttx.html