基于JS的类型检测

来源:互联网 发布:淘宝全国销量排行榜 编辑:程序博客网 时间:2024/06/05 08:52

(一)准备

js中数据类型可分为两大类:

原始类型:Number,String,Boolean,Null,undefined

对象类型:Object,包含Function,Array,Date等

那么,判断js数据类型,也就是我们说的类型检测,本文提供五种方法,如下: 

(二)typeof运算符

typeof算是最常见的,使用时会返回一个字符串,适合函数对象和基本类型(js中的基本类型:number、string、boolean、null、undefined、object[对象])的判断。

例子:

typeof 100 === “number”typeof true === “boolean”typeof function () {} === “function”typeof(undefined) ) === “undefined”typeof(new Object() ) === “object”typeof( [1, 2] ) === “object”typeof(NaN ) === “number”typeof(null) === “object”

(三)instanceof操作符

obj instanceof Object,适合自定义对象,也可以用来检测原生对象。左边操作数obj为对象(如果写成其他类型,就会返回false),右边操作数Object为函数对象或者是函数构造器,否则抛出TypeError。 此方法是判断出具体的数据类型,绝不含糊。

注意:不同的Windows或iframe间的对象类型检测不能使用instanceof。

例子:

[1, 2] instanceof Array === truenew Object() instanceof Array === false

(四)Object.prototype.toString方法

通过Object.prototype.toString得到,适合内置对象和基本类型

注意:当IE6/7/8遇到null和undefined时此方法会失效,会返回[object,object]

例子:

Object.prototype.toString.apply([]);=== “[objectArray]”;Object.prototype.toString.apply(function(){}); ===“[object Function]”;Object.prototype.toString.apply(null); === “[object Null]”Object.prototype.toString.apply(undefined); === “[object Undefined]”IE6/7/8 Object.prototype.toString.apply(null) 返回”[objectObject]”

(五)constructor属性

在使用instanceof检测变量类型时,我们是检测不到number, 'string', bool的类型的。因此,我们需要换一种方式来解决这个问题。

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

constructor本来是原型对象上的属性,指向构造函数。但是根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor属性的。constructor属性是可以被修改的,会导致检测出的结果不正确

(六)duck type

利用具体类型的特征进行判断。 比如不知道一个对象是不是数组,可以判断它的length是不是数字,它是不是有join,push这样一些数组的方法。通过一些特征判断对象是否属于某些类型,这个有时候也常用。部分可以参考JavaScript和ES6中字符串、数组对象的比较点击打开链接的方法进行判断。