所以两大类的数据引用方法是不同的,见下例:
- 原始数据的引用
案例一:
var a = 10;
var b = a;
a = 20;
document.write(b); //return 10 (b没有受到新赋值a的影响)
复杂数据的引用
案例二:
var arr1 = [1,2];
var arr2 = arr1;
arr1.push(3);
document.write(arr2); //return [1,2,3] (arr2受到了arr1的影响)
案例三:
var arr1 = [1,2];
var arr2 = arr1;
var arr1 = [1,2,3];
document.write(arr2); //return [1,2] (arr2没有受到arr1的影响)
发生上述三个不同情况的根本原因在于存储位置stack与heap的区别。
案例一:
var a = 10;
var b = a;
a = 20;
document.write(b); //return 10 (b没有受到新赋值a的影响)
在案例一中,10赋值给a,相当于在stack栈中给a开设了一个存储空间,存储的数值为10。a再赋值给b,相当于给b开设了一个存储空间,值从a的空间直接复制。所以如图,a与b二者在赋值后是相互独立的。改变a的值只是改变了a空间,和b没有关系。两个不同的存储空间。
案例二:
var arr1 = [1,2];
var arr2 = arr1;
arr1.push(3);
document.write(arr2); //return [1,2,3] (arr2受到了arr1的影响)
所有复杂数据都储存在堆heap中,但是并非直接通过名称储存,而是通过stack存储的路径。把数组储存在heap中,通过heap的路径(eg. heap1001)来引用。路径存储在stack的空间中。所以当arr1把数组赋值到arr2时,实际上是两个stack栈(arr1,arr2)共同指向堆heap的同一个空间[1,2]。push(3)输入后heap1001的值改变为[1,2,3],自然,arr1与arr2的值都会改变,因为arr1与arr2指向同一房间。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200510171844743.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NhcGdyYXM=,size_16,color_FFFFFF,t_70
案例三:
var arr1 = [1,2];
var arr2 = arr1;
var arr1 = [1,2,3];
document.write(arr2); //return [1,2] (arr2没有受到arr1的影响)
把arr1的值赋给arr2,实际上是把arr1的空间heap1001共享给arr2. arr1被重新赋值新的数组,是指在heap中开设新的空间来存储新数组。所以arr1指向[1,2,3],arr2指向[1,2],两者互不干涉,最后输出arr1还是原始的数组[1,2]
综上所述,只要开设新数组,那么就会开设新的房间,该房间不会对其他变量产生影响。不同的数据类型存储方式不同,需要区别分析,不能简单赋值。