对象是构造函数的实例,所以测试是看左手是不是右手的实例,所以右手一定是函数(而且必须是构造函数的构造函数才能返回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]] 内部属性。
所以它需要一个TypeError
if 右手没有内部[[HasInstance]]
属性,但没有指定措辞。
Firefox 4 给了我一个更明智的错误信息:
[1,2,3] instanceof [];
// TypeError: invalid 'instanceof' operand []