xxjoy 2019-06-27
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...