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