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

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]是正确的,而[]才是问题所在,需要用一个函数来替换它,但错误信息似乎表明相反。

请有人解释一下我如何错误地解释了错误信息吗?

1个回答

25

对象是构造函数的实例,所以测试就是看左侧是否是右侧的 实例,因此右侧必须是一个函数(且它必须是构造对象的构造函数才能返回true)。

[1,2,3] instanceof [].constructor;  // true
所以更直接地回答问题,你最初的理解是正确的,错误消息似乎有误导性(至少对我来说是这样)。
根据规范:http://ecma262-5.com/ELS5_HTML.htm#Section_11.8.6http://ecma262-5.com/ELS5_HTML.htm#Section_15.3.5,如果右侧没有内部的[[HasInstance]]属性,则需要抛出一个TypeError,但并未指定措辞。Firefox 4给了我一个更合理的错误消息:
[1,2,3] instanceof [];

// TypeError: invalid 'instanceof' operand []

啊,好的,所以错误信息说它期望一个函数而不是左边放置的内容,这个表述并不太好,对吗? - pimvdb
@pimvdb:是啊,我不明白为什么要用那种措辞。 - user113716
“必须是构造对象的构造函数才能返回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; - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接