判断javaScript数据类型,也就是我们说的类型检测,有五种方法:分别是typeof运算符,instanceof操作符,Object.PRototype.toString方法,constructor属性,duck type,这部分我推荐大家看看阮大大写的Javascript标准参考教程
使用typeof检测对象类型:
typeo作为最常用的检测类型的方法,返回字符串类型,适合函数对象和基本类型(JavaScripe中的基本类型: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"可以看到,对于最基本的类型可以测试出类型,但对于其他的,包括日期,数组等大多都返回object类型,而且null也返回的是object类型,也就是没有办法知道确切的类型
使用instanceof检测对象类型:
obj instanceof Object:左边操作数obj为对象(如果不小心写成基本类型,比如数字啥的,就会返回false),右边操作数Object为函数对象或者是函数构造器,否则抛出TypeError
实质就是:instanceof操作符判断左操作数对象的原型链上是否有右边这个构造函数的prototype属性,也就是说指定对象是否是某个构造函数的实例,最后返回布尔值,这个对整个原型链上的对象都是有效的,由于instanceof对整个原型链上的对象都有效,因此同一个实例对象,可能会对多个构造函数都返回true!
[1,2] instanceof Array //truenew Object() instanceof Array /false再某些ie版本中存在跨iframe问题,每个iframe下都有自己的一套原型链,跨frame实例化的对象彼此是不共享原型链,所以不同window或iframe间的对象类型检测不能使用instanceof!!!
使用Object.prototype.toString方法:
Object.prototype.toString.apply([]); //"[object Array]"Object.prototype.toString.apply(function(){}) //"[object Function]"Object.prototype.toString.apply(null) //"[object Null]"Object.prototype.toString.apply(undefined) //"[object Undefined]"//IE/7/8的Object.protope.toString.apply(null) //[object Object]"使用constructor属性:
所有实例对象都有constructor属性,constructor属性指向prototype对象所在的构造函数,就是说指向创建这个实例的构造函数,还是推荐阮大大的文章,看这个constructor属性
使用duck type(鸭子类型):
比如判断一个对象是否是数组,可以看这个对象是否拥有length()等方法,不禁想到类数组转数组的方法,看这里类数组转数组了
JavaScript之类型检测的总结:
1.typeof:适合基本类型和function检测,遇到null失效
2.通过{}.toString拿到,适合内置对象和基本类型,遇到null和undefined失效
3.instanceof:适合自定义对象,也可以用来检测原生对象,在不同iframe和window间检测时失效
来看一道面试题:怎么判断一个变量类型是不是数组?
1.通过constructor(不推荐使用):
[].constructor===Array //true2.通过instanceof:
[] instanceof Array //true在页面中含多个窗体或者iframe,那么会产生很多执行环境,一个iframe下的数组不是另一个窗体下构造函数的实例,那么如果出现这种极端条件,instanceof也不推荐使用
3.通过Array.isArray:
//在新版浏览器,IE9+都已经实现了原生方法:Array.isArray([1,2]); //true4.通过toSting:
Object.prototype.toString.call([]) === '[object Array]'新闻热点
疑难解答