JS是弱语言,其数据类型可以自动转换,因此很多时候在用到数据的时刻不清楚数据的类型到底是哪种,需要进行判断后,再执行语句。
最新的ECMAScript规范定义的数据类型分为两大类,分别为基本类型和引用类型。
- 基本类型: String, Number, Boolean, Undefined, Null, Symbol
基本类型也称为简单类型,作为简单的数据段占据的空间固定。因此为了提升变量的查询速度,基本类型的数据存储在栈(stack)中,是按值访问。其中,值是无法改变的,对值的操作只会产生新的值,原始值并不发生改变,因此又叫原始值类型; - 引用类型: Object(Function,Array,RegExp,Date等内置对象也是引用类型)
引用类型也称为复杂类型,值的大小会改变,故不能将其存放在栈中,否则会降低变量的查询速度。因此,引用类型的数据,值存储在堆(heap)中。引用类型变量存储的值是一个指向存储对象内存地址的指针,是按址访问。
对于数据类型的判断,有如下的方法:
- toString()方法:toString()方法是Object原型上的方法,调用toString()方法默认返回当前对象的[[class]]属性,这是一个内部属性,格式为[object Xxx],其中Xxx就是数据类型,X表示大写字母。
作为目前最有效的判断数据类型的方法,toString()方法可以这样调用Object.prototype.toString.call(arg);其中,arg为参数,即要进行类型判断的变量。
Object.prototype.toString.call('') ; // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
- typeof操作符: 其后接一元表达式,返回结果是number、boolean、symbol、string、object、undefined、function这7中数据类型的一种。在用typeof做判断时,返回的结果不够精细,比如
typeof null; // object
只返回object类型而不是Null类型; - instanceof操作符:这是用来判断原型与实例关系的操作符。当实例的__proto__属性指向了某种类型的prototype时,则instanceof返回true,否则返回false;但这里也存在着返回结构不够精细的特点。