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

pim*_*vdb 17 javascript instanceof

我正在玩instanceofChrome,但收到了错误消息.我我知道为什么(你必须instanceof在创建对象的构造函数之后提供一个函数),但错误消息似乎在说明其他内容:

[1,2,3] instanceof Array
// true

[1,2,3] instanceof []
// TypeError: Expecting a function in instanceof check, but got 1,2,3
Run Code Online (Sandbox Code Playgroud)

这是否意味着我应该[1,2,3]用函数替换?我认为这[1,2,3]是正确的,这[]是问题,应该用一个函数替换,但看起来错误信息正好相反.

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

use*_*716 25

对象是构造函数的实例,因此测试是查看左手是否是右边的实例,因此右边必须是一个函数(并且它必须是构造要返回的对象的构造函数true).

[1,2,3] instanceof [].constructor;  // true
Run Code Online (Sandbox Code Playgroud)

因此,为了更直接地回答这个问题,您的初步理解是正确的,并且错误信息似乎具有误导性(无论如何).

来自规范:http://ecma262-5.com/ELS5_HTML.htm#Section_11.8.6

1.8.6 instanceof运算符

ShiftExpression的生产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 []
Run Code Online (Sandbox Code Playgroud)