这个instanceof错误消息是什么意思?

时间:2011-05-16 17:47:22

标签: javascript instanceof

我在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]是正确的并且[]是问题,应该用函数替换,但看起来错误信息正好相反。

有人可以解释我是如何错误地解释错误消息的吗?

1 个答案:

答案 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 []