a instanceof b
是否与a.constructor === b
完全相同?
如果没有,请告诉我这些之间的区别。
答案 0 :(得分:15)
答案 1 :(得分:2)
SLaks' answer是正确的,但我想补充一点,.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
的{{1}}。这对于数字和布尔值的工作方式相同。
您还可以在基本类型上使用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
,如果您要检查变量是instanceof
,String
还是Number
对象而不是原始类型。Boolean
,如果要检查变量的类型是否是原始类型而不是对象。