17

instanceofChromeでいじっていましたが、エラーメッセージが表示されました。理由はわかっていると思いますが (オブジェクトが作成されたコンストラクターであるキーワードの後に​​関数を指定する必要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: ShiftExpression の RelationalExpression インスタンスは、次のように評価されます。

  • lref を RelationalExpression の評価結果とします。
  • lval を GetValue(lref) とします。
  • ShiftExpression を評価した結果を rref とします。
  • 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]]プロパティがなく、文言が指定されていない場合は a が必要です。

Firefox 4 では、よりわかりやすいエラー メッセージが表示されます。

[1,2,3] instanceof [];

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