值类型:也称为原始数据或原始值(primitive value)。javascript
这类值存储在栈(stack)中,栈是内存中一种特殊的数据结构,也称为线性表,栈按照后进先出的原则存储数据,先进入的数据被压入栈底,最后插入(push)的数据放在栈顶,须要读取数据时从栈顶开始弹出(pop)数据,即最后一个数据被第一个读出来。所以说,值类型都是简单的数据段。变量的位置和变量值的位置是重叠的,也就是说值类型的数据被存储在变量被访问的位置。html
引用类型:这类值存储在堆(heap)中,堆是内存中的动态区域,至关于自留空间,在程序运行期间会动态分配给代码和堆栈。java
堆中存储的通常都是对象,而后经过一个编号传递给栈内变量,这个编号就是所谓的引用指针(point),这样变量和变量值之间是分离的,它们经过指针相联系。当读写数据时,计算机经过变量的指针找到堆中的数据块,并进行操做。数据结构
在JavaScript中,number、string、boolean、null和undefined型数据都是值类型。因为值类型数据占据的空间都是固定的,因此能够把它们存储在狭窄的内存栈区。这种存储方式更方便计算机进行查找和操做,因此执行速度会很是快。post
而对于object型数据(包括function和array)来讲,因为它们的大小是不固定的,因此不能存储在栈区,只能被分配到堆区,若是存储在栈区,则会下降计算机寻址的速度。而堆的空间是不固定的,因此很适合存储大小不固定的对象数据,而后在栈区存储对象在堆区的地址便可,而地址的大小是固定的,因此这种分离存储的方法不会影响计算机的寻址速度,对于变量的性能也没有任何负面影响(如图)。性能
在JavaScript语言中,object、function和array等对象都是引用型数据。不少语言都把字符串视为引用型数据,而不是值类型,由于字符串的长度是可变的。可是JavaScript比较特殊,它把字符串做为值类型进行处理。不过,字符串在复制和传递运算中,是以引用型数据的方法来处理的。url
1.返回数据类型指针
undefinedhtm
string对象
boolean
number
symbol(ES6)
Object
Function