基本数据类型有number、string、boolean、undefined、null,值是不可变的,存放在栈内存当中,es6又引入了BigInt(大整数)和Symbol
引用数据类型有object、function、array,值是可变的,存放在堆内存,通过栈内存的指针指向
堆内存和栈内存就像一个个的小房子,每个房子都有自己的编号,存取东西的时候直接按照编号来
基本数据类型
1、当创建两个变量时,栈内存中就会保存这两个值
//基本数据类型的引用赋值不会改变原始值
var a = 1;
var b = a;
console.log(a,b)//1,1
2、当改变a的值的时候,b的值并不会受影响,因为改变的只是a房间的值。实际上并不是改变了a的值,而是重新给a分配了一个房间,原来的值仍然在,只是没有联系了,原来存放a值的房间号码还原,但值还在。
//基本数据类型的引用赋值不会改变原始值
var a = 1;
var b = a;
console.log(a,b)//1,1
a=2;
console.log(a,b)//2,1
引用数据类型
1、当创建两个数组时,因为是引用数据类型,堆内存中就会保存这两个值,并且arr和arr1都指向同一个堆内存的地址
//引用数据类型的值是可变的
var arr = [1,2];
var arr1 = arr;
console.log(a,b)//[1,2],[1,2]
2、当push一个值进arr里面时,arr和arr1的值都会发生改变,都会增加一个3,因为它们指向的是同一个地址
//引用数据类型的值是可变的
var arr = [1,2];
var arr1 = arr;
console.log(a,b)//[1,2],[1,2]
arr.push(3);
console.log(arr ,arr1 )//[1,2,3],[1,2,3]
3、当重新给arr赋值时,arr的引用地址会发生改变,arr1不会(js执行顺序的问题,在此之前arr1已经指向了堆内存1001)
//引用数据类型的值是可变的
var arr = [1,2];
var arr1 = arr;
console.log(a,b)//[1,2],[1,2]
arr = [1,2,3];
console.log(arr ,arr1 )//[1,2,3],[1,2]
第二步是操作数组arr,那么堆内存里面的值会发生改变,第三步是重新给arr赋值,它指向堆内存的地址发生了变化