2017-05-29 12 views
0

オブジェクトリテラルが{}.toString()のようなメソッドtoString()を呼び出すと、構文エラーが発生しますが、配列リテラルコールtoString()を呼び出すと問題ありません。変数にオブジェクトリテラルを代入すると、toString()メソッドを呼び出すとOKになります。どうして?たとえば、次のようになぜ{} .toString()のようなtoString()メソッドをリテラル呼び出しで呼び出すことができないのですか?

var o = {}; 
o.toString(); // OK 

{}.toString(); 
// > Uncaught SyntaxError: Unexpected token . 
[1, 2, 3].toString(); // OK 

ありがとう!

答えて

8

{}は、そのコンテキストのリテラルではなく、有効なブロックとして最初に認識されるためです。

簡単に言えば、その行は左から右に解釈され、{に遭遇し、したがってブロックが開始されていると考えます。ブロックが終了すると、.が発生し、その識別子はそこでは許可されません。

({}).toString()を使用すると問題なく動作します。

これは、行が(で始まり、式を期待するため、空のオブジェクトとして評価される式として{}を正しく識別し、 '.toString() `が許可されているためです。

{}が別のコンテキスト(たとえば、あなたの例では、o = {}は、割り当ての右側(=の後)にあるため、これは空のオブジェクトとして正しく解釈されます。

ES6では、これを理解することが重要な、同様の、しかしより一般的な/実用的な状況があることに注意してください。

[1,2,3,4].map(val => { v: val, isOdd: v % 2 === 1 }) // ERROR 
[1,2,3,4].map(val => ({ v: val, isOdd: v % 2 === 1 })) // OK 
+0

詳細に説明できますか?これはなぜ起こりますか?ありがとう。 – zhenguoli

+2

[グループ化](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping)の方が[優先度]が高い(https://developer.mozilla.org/en/ docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table)を[member access](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Dot_notation)よりも優先します。 –

関連する問題