instanceof和构造函数属性之间的差异

Difference between instanceof and constructor property

本文关键字:之间 属性 构造函数 instanceof      更新时间:2023-09-26

a instanceof ba.constructor === b完全等价吗?如果没有,两者之间有什么区别?

否。

instanceof还检查"继承的"构造函数。

有关更多信息,请参阅规范(此处和此处)

SLaks的答案是正确的,但我想补充一点,.constructor适用于基元类型,而instanceof不适用:

"Hello World".constructor == String;    //true
"Hello World" instanceof String;    //false

第二个条件为false的原因是"Hello World"是基元字符串,而不是对象,因此它不是任何东西的实例。另一方面,在第一种情况下,当将方法(如constructor)应用于基元类型时,它将被转换为对象。因此首先将"Hello World"转换为new String("Hello World"),然后返回new String("Hello World").constructor,即String。这对数字和布尔值的作用相同。

您也可以在基元类型上使用typeof,但这在对象上不起作用:

typeof "Hello World";    //"string"
typeof new String("Hello World");    //"object"

因此,如果您正在处理字符串、数字或布尔值,并且不需要担心继承问题,则应该使用:

  • .constructor如果您想检查变量是字符串、数字还是布尔值,并且它是基元类型还是对象都无关紧要。

    还有其他方法可以做到这一点,如typeof foo.valueOf()(foo instanceof String || typeof foo == "string"),但.constructor是最短的。但是,如果由于某种原因,您有继承StringNumberBoolean的类,并且您还想检查继承的类型,则较长的方法可能会很有用。

  • 如果要检查变量是否是StringNumberBoolean对象而不是基元类型,请选择instanceof
  • 如果要检查变量的类型是否为基元类型而非对象,请选择typeof

此外,如果处理对象,构造函数属性可能会被覆盖(如果编写ObjectName.prototype),因此通常最好使用instanceof方法来检查对象的类型。

或者,您可以在原型声明中指定构造函数:

ObjectName.prototype = {
  constructor: ObjectName,
  someOtherProp: ''
}