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

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


在不少地方咱们须要进行类型检测, 通常的检测方法有如下几种:java

经过typeof 操做符判断web

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的占位符. 函数

经过下面三种方法能够解决刚才的问题.prototype


经过Object.prototype.toString方法判断 code

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

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

经过 constructor 属性判断继承

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

''.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...

相关文章
相关标签/搜索