JavaScript数据类型检测(js判断数据类型的方法及优缺点)
1. JavaScript中的数据类型
JavaScript的数据类型分为两类:原始类型(Primitive type)、引用类型(Reference type),二者在内存中的存储位置不同。判断一个变量属于哪种类型,这两类数据类型的判断方式也有所有不同,分别使用typeof和instanceof进行检测。
原始类型
原始类型就叫做基本类型,在ECMAScript 5标准中共规定了5种基本类型,分别是:数字类型(Number)、字符串类型(String)、布尔值(Boolean)、Null、Undefined。在ECMAScript 2015(ECMAScript 6)中,还新增了Symbol。
原始类型存储在内存栈(stack)中,也就是说直接存储的变量的值。对于原始类型的访问是“值访问”,我们可以直接操作变量的实际值。
引用类型
除了6种原始类型外,都是引用类型。主要有:对象类型(Object)、数组类型(Array)、日期类型(Date)、错误类型(Error)、正则表达式类型(RegEx)、函数类型(Function)等。在ECMAScript 2015中,还新增了Promise、Map等引用类型。
引用类型是存储在内存堆(heap)中对象,也就是说直接存储的变量的值是一个指向原对象内存指针。对于原始类型的访问是“引用访问”,我们不能直接操作对象的实际内存空间。
2. 原始类型的检测
检测原始类型时,除“Null”类型外,都可以使用“typeof”操作符检测。“typeof”检测后会返回一个表示检测对象类型的字符串。“typeof”语法如下:
typeof <变量>
或者
typeof(<变量>)
使用“typeof”进行原始类型检测时,其返回值分别如下:
Number类型-返回'number'
String类型-返回'string'
Boolean类型-返回'boolean'
Undefined类型-返回'undefined'
Null类型-返回'object'
Symbol类型-返回'symbol'
示例如下:
对于原始类型中“Null”类型进行“typeof”检测时返回值为'object',要正确判断是否是“Null”类型,应该使用“===”和“!==”进行比较。
3. 引用类型的检测
除原始类型外都是引用类型,而JavaScript中Object类型是所有引用类型的基类型,所以大多数引用类型使用typeof检测时都会返回'object'。
示例如下:
如上所示,除“Function”,其它引用类型都返回了'object',“typeof”运算符并不能有效检测引用类型。
对于引用类型来说,更推荐使用“instanceof”运算符检测。其语法结构为:
value instanceof constructor
对上面引用类型做“instanceof”检测结果如下:
来自:http://itbilu.com