Ethan Zhu
©️朱俊辉
All Rights Reserved.

复制变量值的深度理解

  • 基本类型值的复制

在从一个变量向一个变量复制基本类型值和引用类型值时,也存在不同. 如果从一个变量向另一个变量复制基本类型的值时,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上 . 来看一个例子:

  var n1 = 5
  var n2 = n1;
  console.log(n2)//5
  n1 = 10//这个时候n1变量重新赋值10
  console.log(n2)//依然是5
//这就证明了n2变量中的值只是当初复制n1变量的值的一个副本,复制后两者互不影响
  • 引用类型值的复制

当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中. 不同的是,这个值的副本实际上是一个指针,而这个指针指向的是存储在堆( 堆是指内存中的一块区域,详细自行百度内存管理 )中的一个对象 . 复制操作结束后,两个变量实际上将引用堆中的那个对象,也就是指针指向的那个对象 . 因此,改变其中一个变量,就会影响另一个变量,如下面的例子所示:

 var obj1 = new Object();
 //实例化一个对象,并赋值给变量obj1,由于对象是引用类型值,此时变量obj1中存储的是一个指针,该指针指向堆中的对象
 var obj2 = obj1;
 //此时变量obj1中的指针复制给变量obj2,此时obj2中的指针也指向obj1所指向的对象,为同一个
 obj1.name = 'hello world';
 //此时用变量obj1操作指针指向的对象,添加一个属性为name,并且赋值'hello world'
 console.log(obj2.name);
 //输出 hello world 因为两个变量中的指针相同,都是指向堆中的同一个对象,所以对象中的属性和方法可以共享

画个图如下

2016-12-19

发表评论