浅复制和深复制中的传值与传址

来源:互联网 发布:广播剧 知乎 编辑:程序博客网 时间:2024/06/16 02:37

标题中的4个术语,对应的英文分别是:shallow copy(注意,不是shadow copy)、deep copy、pass by value、pass by reference(或pass by address)。传址和传引用是一回事。  

 

浅复制 ( shadow copy ) :

        var a = "value1"

       var  b = a.copy();

 

        相当与一个值的拷贝,重新分配空间生成一个副本,如:

      

       var  a = "value1";  

       var  b = a;  

       a = "value2";  

  

此时,b 中保存的值不会也变成"value2", 因为b拷贝a传的是a的值,所以a和b只是在值上equal,但是存在不同的地址上,改变a的值,事实上此时a的地址也发生了变化,指向了“value2”的地址,而之前那个“value1”的地址因为没有被引用,将会因为空间被回收而消亡,而b依旧对应复制后分配的地址。

 

深复制 ( deep copy ) :

      var P1 = {a:1,b:2};

     var P2 =deepcopy( P1);

      拷贝的直接是对地址的引用,传的是地址,相当于门牌号,同一个门牌号,固然,两者指向同一个内存空间,如:    

            var  P1={a:1,b:2};

            var   P2 =P1;

             P1.a = 2;

    这个时候:

              p2.a = 2;

  同样:

           P2.b = 3 ;

           P1.b = 3 ;

也就是改变任意一个,就相当于都是改变该门牌号对应的房子中的装修、布置,它们是等价的。

原创粉丝点击