在JavaScript中,如何判断数据类型(类型检测)

javascript的数据类型可以分为两大类:原始类型和引用类型. 原始类型(基本数据类型)包括Undefined、Null、Boolean、Number和String五种,而引用类型也称为复杂类型,在Javascript中是Object。与此相对应,它们的值也分别被称为原始值和复杂值.


在很多地方我们需要进行类型检测, 一般的检测方法有以下几种:

通过typeof 操作符判断

typeof   2               //   number
typeof   null            //   object
typeof   {}              //   object
typeof    []             //   object
typeof    undefined      //   undefined
typeof   '222’           //   string
typeof  true             //   boolean

但是在使用 typeof 检测引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "object"。并且null也不符合常规, 它是基本类型,但是typeof出来是object. 可以理解成是obj的占位符.

通过下面三种方法可以解决刚才的问题.


通过Object.prototype.toString方法判断

这是对象的一个原生原型扩展函数,可以用来更精确的区分数据类型。可以自行封装一下方便使用.

var gettype=Object.prototype.toString
gettype.call('aaaa')        //  [object String]

通过 constructor 属性判断

所有实例对象都有constructor属性,constructor属性指向prototype对象所在的构造函数,就是说指向创建这个实例的构造函数。

''.constructor==String    
 [].constructor==Array
var obj= new Object() 
obj.constructor==Object

通过instanceof操作符判断

instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型。
obj instanceof Object,左边操作数obj为待检测对象(如果不小心写成基本类型 比如数字原始值,就会返回false. ),右边操作数Object为函数对象或者是函数构造器,否则抛出TypeError.

常规用法:

var a = new String("hello world");
console.log(a instanceof String);   // "true"

更重要的应用是 instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型。例如:

// 判断 foo 是否是 Foo 类的实例 , 并且是否是其父类型的实例
function Aoo(){}
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型继承
 
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true

实质就是:instanceof操作符判断左操作数对象的原型链上是否有右边这个构造函数的prototype属性,也就是说指定对象是否是某个构造函数的实例,最后返回布尔值,这个对整个原型链上的对象都是有效的,由于instanceof对整个原型链上的对象都有效,因此同一个实例对象,可能会对多个构造函数都返回true.

PS: instanceof 运算符是从Java 中引入的. 其检测原理是js基于原型链的继承关系. 更多信息请参考https://www.ibm.com/developer...

阅读 1.1k

推荐阅读