オブジェクトはコンストラクター関数のインスタンスであるため、テストは左手が右手のインスタンスであるかどうかを確認することです。したがって、右手は関数でなければなりません (そして、返すオブジェクトを構築したコンストラクターでなければなりません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 []