javascript类型判断详解

  • 格式:docx
  • 大小:26.73 KB
  • 文档页数:5

js类型识别是一个简单而又纠结的问题。

typeof
typeof操作符可以说是js中最简单直接的类型判断方式了,缺点就是有时也不太靠谱。

它无法识别Array类型和null类型,还有Date、Math、Error、JSON、RegExp这些类型就更不必多说了。

instanceof
instanceof操作符能判断一个对象是否是某个类(或子类)的一个实例。

相比typeof,instanceof的范围广泛很多,还可以判断自定义类型。

如:
对于string、boolean、number等原始值类型,instanceof就不太好用了:
因为原始值类型并不是任何类的实例,还记得以前提到过的String()以及new String()的区别吧。

constructor
constructor能反映创建当前对象的构造函数,也没有如instanceof那样无法正确识别string等原始值类型:
用constructor来判断对象是否属于某个自定义对象类型,没有instanceof来的靠谱。

而且,IE6\7下,DOM元素的constructor有兼容性问题。

使用instanceof和constructor还需要注意一个跨iframe的问题:
简单来讲,instanceof和constructor的方式,会对内置对象(或自定义类)有依赖。

而不同iframe 的window中会有不同的内置对象。

Object.prototype.toString
相对来说,Object.prototype.toString方法的精准性高很多。

如果要判断DOM元素,可以通过object.nodeType来识别,当非要自定义一个对象有个nodeType属性那就无语了。

Object.prototype.toString相对于其它,还有个不足,就是性能问题,可以看一下这个测试:显然Object.prototype.toString.call要比其他方式慢得多,所以,非不得已,没必要用这种方式。

小结
∙typeof:简单快捷,但无法区分各种object类型;
∙instanceof: 可识别自定义对象类型,无法识别原始值类型,且依赖环境中的内置对象或自定义对象;
∙constructor: 可识别各种类型(包括自定义对象类型),但constructor可能被修改导致不准确,且依赖环境中的内置对象或自定义对象;
∙Object.prototype.toString: 精准性高,但有兼容性问题,且效率比较低。

彼此之间没有绝对的优劣,如果使用在很明确判断哪种数据类型的时候(如实现isArray),可以根据各种方式的特点选择最优的。

也可以实现一个通用的type方法,来修复typeof的不足。

如:。