我正在使用Chrome中的instanceof
,但是我得到了一个错误信息。我想我知道原因(您必须在instanceof
关键字之后提供一个函数,该函数是用来创建对象的构造函数),但错误消息似乎说明了一些其他问题:
[1,2,3] instanceof Array
// true
[1,2,3] instanceof []
// TypeError: Expecting a function in instanceof check, but got 1,2,3
这是否意味着我应该用函数替换[1,2,3]
?我会认为[1,2,3]
是正确的,[]
是问题所在,应该用一个函数替换,但看起来错误消息说的正好相反。
有人能解释一下我是如何错误地解释错误消息的吗?
发布于 2011-05-17 01:49:16
对象是构造函数的实例,因此测试的目的是查看左手是否是右手的实例,因此右手必须是函数(并且必须是构造对象的构造函数才能返回true
)。
[1,2,3] instanceof [].constructor; // true
因此,为了更直接地回答这个问题,您最初的理解是正确的,错误消息似乎具有误导性(至少对我而言)。
从规范中:http://ecma262-5.com/ELS5_HTML.htm#Section_11.8.6
1.8.6 instanceof operator
ShiftExpression的生产RelationalExpression: RelationalExpression实例评估如下:
让lref为RelationalExpression.
和http://ecma262-5.com/ELS5_HTML.htm#Section_15.3.5
15.3.5函数实例的属性
除了必需的内部属性外,每个函数实例都有一个[Call]内部属性,并且在大多数情况下使用不同版本的[Get]内部属性。根据函数实例的创建方式(请参阅8.6.2、13.2、15和15.3.4.5),函数实例可能具有[HasInstance]内部属性、[Scope]内部属性、[Construct]内部属性、[FormalParameters]内部属性、[Code]内部属性、[TargetFunction]内部属性、[BoundThis]内部属性和[BoundArgs]内部属性。
因此,如果右手没有内部[[HasInstance]]
属性,但没有指定措辞,则需要一个TypeError
。
Firefox4给了我一个更合理的错误信息:
[1,2,3] instanceof [];
// TypeError: invalid 'instanceof' operand []
https://stackoverflow.com/questions/6021245
复制相似问题