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…