(一)准备
js中数据类型可分为两大类:
那么,判断js数据类型,也就是我们说的类型检测,本文提供五种方法,如下:原始类型:Number,String,Boolean,Null,undefined
对象类型:Object,包含Function,Array,Date等
(二)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 === true
new 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中字符串、数组对象的比较点击打开链接的方法进行判断。