类型由值决定
原始值 和 引用值的区别: 赋值形式的不同
1. 不可改变的原始值(栈数据)stack
5种原始值: Number String Boolean undefined null
var a = 10;
var b = a;
a = 20;
console.log(a); // a:20
console.log(b); // b:10
栈内值是拷贝关系,不会改变原值。
为什么说不可改变呢,原理如下:
一旦被赋值,如果重新赋值,那么原先被赋值的值会解除与变量的关系,原先的这个值仍然会占据内存空间,会在一个新的空间存放一个值。
2. 引用值(堆数据)heap
array Object function ...date RegExp
* 原理: 在堆内存里存放实际的数据, 在栈内存占据一个空间存放堆内存的地址,
* 当arr=arr1时,引用值互相拷贝的时候拷贝的是地址,即栈地址指向堆内的同一个堆数据。
var arr =[1, 2];
var arr1 = arr;
arr.push(3);
console.log(arr); // [1, 2, 3]
console.log(arr1); // [1, 2, 3] 这里的arr1把arr地址拷贝过来了,但堆内指向的还是同一组数据.
var arr =[1, 2];
var arr1 = arr; //这里arr,arr1都指向[1, 2];
console.log(arr1); // [1, 2]
arr = [1, 3]; //到这一步,重新改变了arr在堆内的占据的地址,即指向由[1,2]变成了[1,3]
console.log(arr); // [1, 3]