17

我在 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]是正确的,这[]就是问题所在,应该用函数替换,但看起来错误消息的意思是相反的。

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

4

1 回答 1

25

对象是构造函数的实例,所以测试是看左手是不是右手的实例,所以右手一定是函数(而且必须是构造函数的构造函数才能返回true)。

[1,2,3] instanceof [].constructor;  // true

所以要更直接地回答这个问题,你的初步理解是正确的,错误信息似乎具有误导性(无论如何对我来说)。

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

1.8.6 instanceof 运算符

产生式 RelationalExpression: RelationalExpression instanceof ShiftExpression 的评估如下:

  • 令 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]] 内部属性。

所以它需要一个TypeErrorif 右手没有内部[[HasInstance]]属性,但没有指定措辞。

Firefox 4 给了我一个更明智的错误信息:

[1,2,3] instanceof [];

// TypeError: invalid 'instanceof' operand []
于 2011-05-16T17:49:15.573 回答