首先说明:JS的值分为原始值(基本数据类型)和引用值(object,array,function,date,RegExp)
栈内存的数据是永久保存的不可修改的。
原始值:内存中是先进后出
引用值的值不是存在栈内存的,引用值的指针存在栈内存。
var a = 3;
在栈内存里,存了个3赋值给a
var a = 3;
var b = a;
又存了一个3,然后赋值给b,a和b互不影响
var a = 3;
var b = a;
a = 1;
将a重新赋值为1,并不是修改原来的,而是在下面重新存了一次,原来的a还原为1008,但是数据是没清除的,所以有些数据是可以还原的。一般情况下,覆盖了,原来的数据就被删除了。所以栈内存是不可修改的
var arr1 = [1, 2, 3, 4];
var arr2 = arr1;
arr1.push(5);
arr1 和 arr2 是一样的,都是12345
引用值的值是存在堆内存里面的,栈内存里存的是堆内存的地址,所以这里arr1,arr2都是指向同一个堆内存地址,push是向里面增加值所以会更改堆内存里面存储的值。
var arr1 = [1, 2, 3, 4];
var arr2 = arr1;
arr1.push(5);
arr1 = [1, 2];
重新给arr1赋值的时候,堆内存里会重新存储新的值(1,2),然后再栈内存里也会新保存一个堆内存的地址,然后将这个地址赋值给arr1,原来的arr1的存储空间恢复成了1005。所以重新赋值的时候,是不会修改原来堆内存中的值,和上面说的push增加值是不一样的。