JavaScript基本类型值和引用类型值的复制问题

参考JavaScript高级程序设计(JS红宝书)

一、基本类型值的复制

如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上(注意,这里为新变量分配了相应类型的内存来存这个值)。

举个栗子:

var num1 = 5;
var num2 = num1;

在这里,num1中保存的值是5.当使用num1的值来初始化num2时,num2中也保存了值5。但num2中的5与num1中的5是完全独立的,该值只是num1中5的一个副本。此后,这两个变量可以参与任何操作而不会相互影响。(注意两个5在两块内存中,名字分别是num1和num2,所以操作其中一个的时候,不会对另外一个产生影响)

如下图:


二、引用类型值的复制

当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量。

举个栗子:

<script type="text/javascript">
    var obj1 = new Object();
    var obj2 = obj1;
    obj1.name = "test";
    alert(obj2.name);
</script>

首先,变量obj1保存了一个对象的新实例。然后,这个值被复制到了obj2中;换句话说,obj1和obj2都指向同一个对象。这样,当为obj1添加name属性后,可以通过obj2来访问这个属性,因为这两个变量引用的都是同一个对象。如下图:

扫描二维码关注公众号,回复: 1711196 查看本文章


可以理解为同一个对象有两个名字(即两个指针指向它),两个名字都可以操作这个对象(就像一个人有两个名字)。

猜你喜欢

转载自blog.csdn.net/thelostlamb/article/details/79598668