2015-01-13 12 views

答えて

10

instanceofはための文法は次のとおりです。ECMA-262 §11.8あたり

RelationalExpression instanceof ShiftExpression 

文頭にある句読点{はブロックの開始点と見なされるため、次のように}がブロックを閉じて文を終了します。

instanceofオペレータは、次の文の始まりであるが、それは関係式が先行されなければならないので、それは開始時にすることはできませんので、パーサは驚きを取得します。

{}をオブジェクトのリテラルとして見なす必要があるのは、文の先頭に何かを入れることです。

({}) instanceof Object 
+1

これは素晴らしい説明です(+1)。ありがとう! – Christos

1

あなたはこの試みる場合:期待される出力され

var a = {} 
a instanceof Object 

出力trueを、。

しかし、あなたのケースで

{} instanceof Object 

上記真出力しません。

後者は、最初のものと同じではありません。最初のケースでは、オブジェクトリテラルを作成しますが、後者の場合は作成しません。したがって、このエラーが発生します。

+0

うーんしかし、なぜそれがオペレータにためらうん。なぜそれはオペレータを認識しないのですか? – balteo

+0

@balteo '{}'これはJavaScriptの演算子ではありません。作成するオブジェクトを順序付けるために '{}'のキー/値のペアを配置することができます。これは、JavaScriptでオブジェクトを作成するための最短方法です。これは呼び出し演算子 '()'のようなものではなく、関数式の後に追加すると、この式が実行されるか、 '+'演算子のようになります。 – Christos

+0

私はなぜそれが 'instanceof'演算子を嫌うのか? – balteo

1

var p = {} 
p instanceof Object 
3

{}を試しは、その文脈において、ブロックなく、オブジェクトリテラルです。

オブジェクトリテラルにするには、コンテキストを変更する必要があります(たとえば、()にラップしてください)。

({}) instanceof Object; 
+0

ありがとうクエンティン:それは動作します。しかし、なぜ演算子が認識されていないのか説明できますか?なぜこのエラーメッセージですか? – balteo

+1

@balteo - オブジェクトではなくコードブロックの後ろに置くためです。 – Quentin

関連する問題