JS里面判断数据类型,一般用typeof或者instanceof两种方法,那么,两者到底有什么区别呢?
typeof用于基本数据类型的类型判断,返回值都为小写的字符串。如果是对象,除了function类型会返回“function”, 其他对象统一返回“object”。详情如下:
typeof.png
instanceof 利用原型链继承关系做判断,它针对对象类型(格式:对象 instanceof 构造函数
)。
“尽管instanceof 运算符的右操作数是构造函数,但计算过程实际上是检测了对象的继承关系,而不是检测创建对象的构造函数 ”(摘自《JavaScript权威指南》)
一旦创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype
属性,该属性指向函数的原型对象XXX.prototype
。在默认情况下,所有原型对象会自动获得一个constructor
属性,该属性指向这个函数。
MDN上对原型上constructor
的解释如下:
所有的对象都有constructor属性。如果一个对象没有显性指定constructor值,那么它将指向原始构造函数。如下所示:
下面是一个典型原型链继承:
参考下图,可以看到,实例instance是由构造函数SubType创建的,默认情况下,instance的__proto__
属性指向SubType.prototype
(instance.constructor === SubType)。但是,由于做了SubType.prototype = new SuperType()
操作,导致SubType.prototype
指针指向SuperType的一个实例,并且SuperType实例的__proto__
属性指向SuperType.prototype
。
由此,生成原型链。
prototype.png
这时根据用instanceof
做类型检测,结果如下:
(感谢@文兴的发现,文章于2017-3-6日被更正)