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)
| 归档时间: |
|
| 查看次数: |
16196 次 |
| 最近记录: |