数据类型,就是将数据按照某一规则进行区别时所定义的分类标签。好比说,一样都是汉字组成的词语,要分动词、名词、介词等。es6
对数据分类,主要有两个缘由:编程
第一,是为了限制不一样种类数据的操做。好比说当你声明一个变量是一个数字,那么,就只能对这个变量进行数字能进行的操做,这在编译代码及排查错误时尤其重要。数组
第二,因为全部的数据都要存储在计算机中,不一样数据的存储位置及所须要的内存大小也不同,而有了数据类型,编程的时候须要用大数据的时候才须要申请大内存,就能够充分利用内存。 函数
例如大胖子必须睡双人床,就给他双人床,瘦的人单人床就够了。大数据
JavaScript 中变量是没有类型的,只有值才有。变量能够随时持有任何类型的值。优化
举个例子:spa
// js let a = 4; a = '4'; a = false;
在上面的例子中能够看到:咱们声明 a 是一个数字,可是咱们在以后将 a 的值又改为了字符串和布尔值(后面会讲这些类型)也并无什么异常。咱们能够看到,变量 a 的类型是随意转变的,这在强类型语言里是不容许的。prototype
所以,判断一门语言是强类型仍是弱类型,就看这门语言中一个变量是否能够赋不一样数据类型的值。设计
在 JavaScript 中,共有七种数据类型,其中,六种是基本/原始类型,一种是对象/复合/引用类型。code
基本类型:
- 字符串(String):表示一个字符串,如“find”。
- 数字(Number):表示一个数字,如 45 。
- 布尔(Boolean):布尔值,包括 false 和 true 。
- 未定义(undefined):只有一个值,undefined , 表示未给变量赋值。
- 空值(null):只有一个值, null , 表示空值得关键字。
- Symbol(es6新增):表示一个惟一且不可改变的值。
引用类型:
- 对象(object): 各类值组成的集合。
其中,对象类型还有一些子类型,如数组,函数,JavaScript 的内建函数等。
主要有两点:
对于 js 来说,是没有栈内存的概念的,可是 js 在编译执行代码时,会首先进入一个执行上下文,在执行上下文的建立阶段,会开辟一片区域,用来存储变量和它们的值,这个区域就叫作变量对象。
大概长这个样子:
如上图所示,对于基本类型的变量,他们的变量名和值都会存储在这个变量对象中,而对于 d , 这个引用类型的值,则只是将这个变量的名字和地址存在变量对象中,变量的值是存储在堆内存空间的,这个区别将会在使用时产生很大的差别,咱们后面再讲。
typeof
方法声明一个变量,使用 使用 typeof
方法会返回一个惟一的数据类型字符串。但这个方法并不怎么靠谱。
值 | 类型 | typeof 值 |
---|---|---|
23 | number | "number" |
"abc" | string | "string" |
false | boolean | "boolean" |
undefined | undefined | "undefined" |
Symbol() | symbol | "symbol" |
{} | object | "object" |
null | null | "object" |
function(){} | object | "funciton" |
从上表中咱们看到,有两处地方和咱们预期不一致。
typeof null
返回的是 "object"
而不是 "null"
。这是 js 语言设计时的一个 bug, 而且在将来也不会更改。
想要争取判断 null 能够加一个条件:
function typeOf(a) { if(!a && typeof a === "object") return "null"; return typeof a; } typeOf({}); // "object" typeOf(null); // "null"
typeof function(){} === "function"
, 这是由于function
做为 js 的一等公民,是能够调用的对象,设计者认为有必要将它和普通对象区别开来。Object.prototype.toString.call()
方法除了 typeof
方法外,调用 Object.prototype.toString.call()
方法 也能够返回一个包含数据类型的字符串,而且更为准确。
值 | 类型 | Object.prototype.toString.call(值) |
---|---|---|
23 | number | '[object Number]' |
"abc" | string | '[object String]' |
false | boolean | '[object Boolean]' |
undefined | undefined | '[object Undefined]' |
Symbol() | symbol | '[object Symbol]' |
{} | object | '[object Object]' |
null | null | '[object Null]' |
function(){} | object | '[object Function]' |
[] | object | '[object Array]' |
从上面们能够看出,这方法对于类型的检测更加精确。
所以,咱们能够写一个函数,用来精确检测类型。
function getClass (a) { const str = Object.prototype.toString.call(a) return /^\[object (.*)\]$/.exec(str)[1] } getClass(null) // "Null"; ...
关于数据类型,就先说到这里,并无深刻到每一种类型中去讲,感受没有必要,关于细节有不少教程。我要作的,是让你们从总体上来看数据类型在 JavaScript 中的表现,这将有助于你们理解后面更加复杂的知识。