标题中的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 ;
也就是改变任意一个,就相当于都是改变该门牌号对应的房子中的装修、布置,它们是等价的。