代码改变世界

Javascript中对象的可复制特性

2012-01-07 10:28  AnyKoro  阅读(246)  评论(0编辑  收藏  举报

在Javascript中,对象其实就是一个key-value的array。但是出于节约资源的目的,几乎所有的现代语言,在出现以下代码的场景时候,都会采用引用传递,而并不是复制。

objectB=objectA;

对于诸如想C#之类的语言,你需要依靠专门的函数去完成clone的功能。但是Javascript却可以更简便的实现,关键利用的就是其Key-Value的array的特性。

在JavaScript中,对于普通基本类型变量的复制,是采用值传递的,这个和其他很多语言的机制也是相同的。

例如,以下代码。

var a=3,b=2;
b=a;//b=3
b=4;//a=3

从上面代码,我们很明显可以看出是真正的复制。

因此,我们就很容易想到,既然JavaScript对象是key-value的array,那么如果我们把每个值取出来然后付给另一个对象是不是就ok了?

答案是肯定的。这里我写个简单的演示程序:

var a={
property:"property",
},b={};

//假复制
b=a;//复制,引用传递
b.property="change";//a.property值也为"change"了。

//真复制。
var c={};
a.property="back";
for(var item in a){
if(a.hasOwnProperty(item)){
c[item]=a[item];

}
}
c.property="changeagain";//a.property还是为back

在这里要注意的是,我们这里的c对象,不能用b对象代替,因为之前b对象已经被引用指向了a。你现在仍和改动,他默认都是会指向a的,所以如果你用b对象的话,会发现,什么都没有变。