• 关于深拷贝和浅拷贝


    1.浅拷贝

    JavaScript存储对象都是存地址的,所以浅复制会导致 a 和 b 指向同一块内存地址

    数组的赋值其实相当于给了索引,改变其中一个变量其他引用都会改变

    1. var a = [1,2,3];  
    2. var b = a;  
    3. b[0] = 4;  
    4. //a为4 2 3  
    5. //b为4 2 3  
    var a = [1,2,3];
    var b = a;
    b[0] = 4;
    //a为4 2 3
    //b为4 2 3

    根据上面存储对象的问题,这里就可以解决另一个问题:

        原始参数(比如一个具体的数字)被作为值传递给函数;值被传递给函数,如果被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用函数。

        你传递一个对象(在js里数组不是简单数据类型,而是对象)到一个函数,如果在函数里面改变了这个参数的内容,在外部这个变化是可见的。

    2.深拷贝

    (1)slice 函数

    (2)concat 函数

    (3)assgin

    三个函数的原理都是返回数组的一个副本(相当于另外开辟内存空间),所以并不会改变数组本身的的值

    但是这里有一点不同,就是assgin与其他两点的不同

    虽然说assgin也是深拷贝,但是他只是第一层深拷贝,第二层之后还是进行浅拷贝,例子如下:

    1. var a = {  
    2.     a1:{  
    3.         aa1:'11',  
    4.         aa2:'22'  
    5.     }  
    6. }  
    7. var b = object.assgin({},a);  
    8. var c = object.assgin({},a);  
    9. b.a1.aa1 = 33;  
    10. /*  
    11. b:{  
    12.     a1:{  
    13.         aa1:'33',  
    14.         aa2:'22'  
    15.     }  
    16. }  
    17. c:{  
    18.     a1:{  
    19.         aa1:'33',  
    20.         aa2:'22'  
    21.     }  
    22. }  
    23. */  
    var a = {
    	a1:{
    		aa1:'11',
    		aa2:'22'
    	}
    }
    var b = object.assgin({},a);
    var c = object.assgin({},a);
    b.a1.aa1 = 33;
    /*
    b:{
    	a1:{
    		aa1:'33',
    		aa2:'22'
    	}
    }
    c:{
    	a1:{
    		aa1:'33',
    		aa2:'22'
    	}
    }
    */
  • 相关阅读:
    OC-为何用copy修饰block
    OC-RunLoop运行循环
    苹果审核之遇到IPV6问题被拒的解决方法
    LeetCode学习_day1:原地算法
    OC-加载h5富文本的代码,并计算高度
    OC-bug: Undefined symbols for architecture i386: "_OBJC_CLASS_$_JPUSHRegisterEntity", referenced from:
    了解iOS各个版本新特性总结
    iOS 快速打包方法
    iOS tableView侧滑删除的第三方控件
    Object_C 集成环信时,中文环境下不显示中文
  • 原文地址:https://www.cnblogs.com/mei123/p/8548772.html
Copyright © 2020-2023  润新知