我在Chrome中使用instanceof
,但收到了错误消息。我想想我知道为什么(你必须在instanceof
关键字之后提供一个函数,该关键字是创建对象的构造函数),但是错误消息似乎在说明其他内容:< / p>
[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]
是正确的并且[]
是问题,应该用函数替换,但看起来错误信息正好相反。
有人可以解释我是如何错误地解释错误消息的吗?
答案 0 :(得分:25)
对象是构造函数的实例,所以测试是看左手是的实例,所以右边必须是一个函数(它必须是构造函数,构造对象以返回true
)。
[1,2,3] instanceof [].constructor; // true
所以为了更直接地回答这个问题,你的初步理解是正确的,错误信息似乎有误导性(无论如何)。
来自规范:http://ecma262-5.com/ELS5_HTML.htm#Section_11.8.6
1.8.6 instanceof运算符
Shiftalpression的生产RelationalExpression:RelationalExpression实例的评估如下:
- 让lref成为评估RelationalExpression的结果。
- 让lval成为GetValue(lref)。
- 让rref成为评估ShiftExpression的结果。
- 让rval为GetValue(rref)。
- 如果Type(rval)不是Object,则抛出TypeError异常。
- 如果rval没有[[HasInstance]]内部方法,则抛出TypeError异常。
- 返回使用参数lval调用rval的[[HasInstance]]内部方法的结果。
和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]]内部属性。
如果右手没有内部TypeError
属性,则需要[[HasInstance]]
,但不指定措辞。
Firefox 4给了我一个更明智的错误信息:
[1,2,3] instanceof [];
// TypeError: invalid 'instanceof' operand []