instanceof和构造函数属性之间的差异
Difference between instanceof and constructor property
a instanceof b
与a.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
是最短的。但是,如果由于某种原因,您有继承String
、Number
或Boolean
的类,并且您还想检查继承的类型,则较长的方法可能会很有用。- 如果要检查变量是否是
String
、Number
或Boolean
对象而不是基元类型,请选择instanceof
- 如果要检查变量的类型是否为基元类型而非对象,请选择
typeof
此外,如果处理对象,构造函数属性可能会被覆盖(如果编写ObjectName.prototype
),因此通常最好使用instanceof
方法来检查对象的类型。
或者,您可以在原型声明中指定构造函数:
ObjectName.prototype = {
constructor: ObjectName,
someOtherProp: ''
}
- 全局变量和全局对象的属性之间有什么区别吗
- Sequelize:属性之间的命名冲突'播放列表'以及关联'播放列表'
- Bacon.js:流和属性之间的实际差异
- JS get元素之间的差异's属性与elem.getAttribute(attr)和elem[attr]
- JS构造函数的原型属性与其原型之间的区别
- 根据DOM,HTML元素的开始和结束标记之间的内容被称为属性.这个房产的名字是什么
- 向构造函数或原型添加属性之间的区别
- 隐藏元素:Javascript属性和CSS样式之间的区别
- React组件之间共享属性
- 正在节点d3.js之间创建链接,当前返回Uncaught TypeError:无法读取属性'weight'
- 在布尔属性JQuery之间切换
- 如何在 Ramda 中的对象属性之间移动值
- node.js 中对象上的方法和属性之间的差异
- Javascript:属性描述符和内置属性属性之间的关系是什么
- 如何有效地搜索具有介于 jquery 之间的索引的 name 属性的输入
- 聚合物中的“观察者”与“通知”(在属性块中)与“观察者”与“侦听器”之间的区别
- VAR 在所选元素之间进行计数和切换,但会复制属性
- 构造函数中的方法与函数的原型属性之间的差异
- 我如何使用 javascript 或 jquery 在单击时在任何 css 属性之间切换
- Html 画布:宽度/高度属性和宽度/高度样式之间的差异