JavaScript数据类型
在C语言中,声明一个整数变量是int a;在这句话中,int就是a的数据类型。但是在JavaScript中,不管任何变量都是用var(ES6会有let和const)声明的,所以可能有人认为JavaScript没有数据类型。事实上,JavaScript的变量确实没有数据类型,但是它的值却是有数据类型的,因此变量的数据类型由它里面存放的值来决定的。
一、内置数据类型
JavaScript中有七种内置的数据类型string、number、boolean、null(已声明,但是值为null)、undefined(已声明未赋值)、object、symbol(ES6新增的)。这7种数据类型分为两类,除了object类型以外其他的统称为基本数据类型,或者值类型,object是引用数据类型。如果声明一个变量并给其赋值,其值如果是基本类型,那么一定是这些数据类型中的一种。如果是引用数据类型,那么可能是array、object、function(ES6的class也是function类型)等。
基本数据类型存储在栈中,这些数据占据空间大小固定,属于经常使用的数据。引用数据类型存储在堆中,这些数据占据空间大,大小不固定,如果存储在栈中将会影响程序性能。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
二、检测数据类型的函数typeof
typeof函数的返回值是一个字符串,并且它只会返回以下字符串:
- string
- number
- boolean
- object
- function
- undefined
- symbol (ES6之后才有,谷歌浏览器typeof Symbol("")返回得结果是symbol)
这里有2点需要注意的东西,一是typeof null的结果也是"object",这可能是一个BUG。(在JavaScript中null的二进制形式全是0,而Object的二进制前三位是0开头,所以null就被误当成object了)。二是引用类型使用typeof检测都是object,但是typeof function(){} 却是function。
所以typeof这个函数并不能完全检测我们想要检测的所有数据类型,它有缺陷:
- 基本数据类型无法检测出null
- 引用数据类型只能检测function
- number类型无法确定是int还是float,这个可以忽略