可以描述:总共8种。
基本数据类型:String、Number、Boolean、Null、Undefined、Symbol(代表创建之后独一无二并且不可变的数据类型||es6新增)、bigInt
引用数据类型:Object、Function、Array、…(归结为Object这一类)
基本数据类型与引用数据类型的区别:
-
声明变量时的存储分配不同。
基本数据类型存储在栈stack中,它们的值直接存储在
变量访问的位置
(这是因为这些基本数据类型占据的空间是固定的,所以可以将它们存储在较小的内存区域-栈中,这样存储便于迅速查寻变量的值)。引用数据类型存储在堆heap中,堆是动态分配变量的内存空间。
存储在变量处的值是一个指针(point)指向存储对象的内存地址。
(这是因为:引用值的大小会改变,放在栈中会降低变量查寻的速度) -
不同的内存分配机制也带来了不同的访问机制。
引用数据类型不可以直接访问堆内存空间的位置以及直接操作堆内存空间。只能操作对象在栈内存中的引用地址,再按照这个地址去获得这个对象中的值。“按引用访问”
基本数据类型是可以直接访问到的,而引用数据类型访问引用地址,根据引用地址找到堆中的实体。
-
赋值变量时的不同。
基本数据类型:var a=1,var b=a;将原始值的副本赋值给新的变量。此后两变量互相独立。改变其一不会影响到其它。“传值”,暂时拥有相同的value而已。
引用数据类型:var obj={name:‘zhangsan’},var obj1=obj,将引用地址赋值给新的变量,但是两个引用地址指向的是同一个堆内存空间的位置,并没有开辟新的堆内存空间;所以但凡作出其一改变,还是会影响到其它的。“传址”
-
参数传递的不同(把实参复制给形参的过程)
- 原始值:只是把变量的值传递给参数,之后参数与该变量互不影响。
- 引用值:对象变量它里面的值是这个对象在堆内存中的内存地址!!时刻铭记!!正因为这,函数内部对这个参数的修改会体现在外部也是这个原因,因为它们指向同一个对象。
输出:[1,2,3,4,5]、1、6、1