【问题标题】:What does this instanceof error message mean?这个 instanceof 错误消息是什么意思?
【发布时间】:2011-05-16 17:47:21
【问题描述】:

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

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

【问题讨论】:

    标签: javascript instanceof


    【解决方案1】:

    对象是构造函数的实例,所以测试是看左手是否是右手的实例,所以右手一定是函数(而且一定是构造函数构造对象返回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 异常。
    • 返回调用rval的[[HasInstance]]内部方法的结果,参数为lval。

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

    因此,如果右手没有内部 [[HasInstance]] 属性但未指定措辞,则它需要 TypeError

    Firefox 4 给了我一个更合理的错误信息:

    [1,2,3] instanceof [];
    
    // TypeError: invalid 'instanceof' operand []
    

    【讨论】:

    • 嗯,好的,所以错误消息指出它需要一个函数而不是放在左边的东西,这不是很好的措辞,对吗?
    • @pimvdb:是的,我不明白为什么会这样写。
    • "必须是构造对象的构造函数才能返回 true" 不完全正确。 instanceof 运算符检查左操作数是否继承自右操作数的原型属性。因此,如果一个对象是由构造函数构建的,并且该构造函数碰巧在其原型属性中引用了与另一个构造函数相同的对象,如果该对象同时针对这两个构造函数进行测试,则 instanceof 将返回 true:var obj={x:1};var class_one=function(){};class_one.prototype=obj;var class_two=function(){};class_two.prototype = obj;var inst = new class_one;inst instanceof class_two;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2010-10-01
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多