1、基础数据类型:(值存放在栈中)
var a = 1;
var b = a;
a = 2;
console.log(a,b) //打印:2,1
结论:简单数据类型赋值时,传递的是真正的值。
解释:当我们声明一个变量a的时候, 会在栈里面开辟出一块新的内存空间, 用来存放这个变量a的数值, 当这个变量a存储的数值发生改变时, 栈空间里的对应那块内存里的数据也会发生改变, 此时如果又声明了一个变量b, 并把变量a赋值给变量b时, 在栈里面又会新开辟出一块空间, 用来存放变量b存储的数值, 而这个数值, 是变量a传递给他的, 因此, 此时两个变量分别对应两块内存空间, 存储的值是相同的, 因此, 当变量a发生改变时, 并不会影响到变量b所拥有的那块内存空间, 所以变量b是不会改变的
2、引用数据类型:(值存放在堆中,内存地址放在栈中)
let obj = {a: 1}
let obj2 = obj;
obj2.a = 2;
console.log(obj) //打印:{a: 2}
结论:复杂数据类型赋值时,传递的是内存地址。
解释:首先会在栈上的变量中存储指向数据的内存地址,然后会在堆内存中开辟一块空间,将数据存放在里面。一旦堆内存中的数据发生改变,因为复杂数据类型传递的是内存地址,所以内存地址就会指向那个改变的值。