JS复制对象误区,包括高手也常犯此错误!

JavaScript 2012-07-30 JavaScript,对象,错误

如果不了解JS底层内存操作,那么也许你会以为对象的复制是相互独立的,其实它们都是一个指针,而这个指针指向存储在堆中的一个对象。复制结束后,两个变量实际上将引用同一个对象。因此改变其中一个变量会影响另外一个变量。

一、普通变量复制,相互独立

// 声明一个变量str1
var str1 = '琼台博客';

// 将变量str1赋值给str2
var str2 = str1;

// 再改变str1的值
str1 = 'www.qttc.net'

// 打印str1与str2的结果
alert('str1:'+str1+'\nstr2:'+str2);

结果

JS复制对象误区

声明一个str1的初始值是“琼台博客”,当使用str1的值来赋给str2时,str2的值也同样是“琼台博客”。最后,str1改变了值,但str1与str2是完全独立,在内存中分别是两个对象,所以改变任何一个变量的值都不会影响到别的变量。

二、对象变量复制,共用一个指针

// 声明一个对象obj1
var obj1 = new Object();

// 将对象obj1复制给obj2
var obj2 = obj1;

// 给对象obj1增加的website属性值为:www.qttc.net
obj1.website = 'www.qttc.net';

// 打印obj1与obj2的website属性结果
alert('obj1的website:'+obj1.website+'\nobj2的website:'+obj2.website);

结果

JS复制对象误区

许多人会误以为只给obj1添加website属性,所以obj2的website属性是undefined。

首先,变量obj1保存了一个对象的新实例。然后,这个值被复制到obj2中。而JS中的对象属于引用类型,所以复制引用类型的值时同样也会在栈中分配一个空间,但obj1与obj2实际上都指向堆内存的一个地址。所以操作obj1也等于操作obj2。obj1添加website属性,obj2也同样拥有website属性。

文字链接:《JS复制对象误区,包括高手也常犯此错误!

文章地址:http://www.qttc.net/201207149.html

除非标注,琼台博客所有博文均为原创,转载请加文字链接注明来源

乳名?小名?昵称?网名?均可

email,放心,我不会给你乱投广告的

想获得回访就把你的站点URL写上(没有留空)

[NOTICE]木要投放广告
[NOTICE]木要骂人,说不该说的话
[NOTICE]自由言论,但要遵纪守法

Comments 4

  • 虽然JS高级程序设计里也有专门说到,不过是一次很好的复习!学习了!
    2016-04-18 18:20:30 [ 跟帖 ]
    JS特性,这个坑让很多新人都踩过
    2017-03-10 09:18:48 [ 跟帖 ]
    1 #
  • 写的不错。每天必看的一个站就是这里了
    2012-07-30 23:46:31 [ 跟帖 ]
    感谢哈~友链内的站也都是我每天必访的。
    2012-07-31 09:15:58 [ 跟帖 ]
    2 #