2016-09-22 10 views

答えて

2

(たとえば、割り当ての右側にあるようにトリガーされる)式コンテキストにない場合、{}a block statementであり、オブジェクトリテラルではありません。

0

パーサーは、{}をコードブロックとして解釈しています。あなたはそれが括弧で括弧を囲むことにより、正しく解析することができます:

({}).toString(); 
1

{} 1枚目の撮影とコールする一切.toStringメソッドを持っていないブロック、と解釈されます。

オブジェクトリテラルを({}).toString()のように括弧で囲むと、期待どおりに機能します。

これは、構文解析ルールの優先順位と、オブジェクト区画とブロック区切り文字の両方にオーバーロードされる{}トークンが原因です。

+0

@TJCrowder修正済み(私は編集作業中でしたが、スペック:()を見落としました。 – ssube

+0

ああ、私はこれをやったことはありません... ;-) –

3

what caused the difference?

パーサがでている状態。デフォルトでは、パーサーは声明を期待した状態にあります。したがって、コンソールのあなたの例では、{は、ブロックのオープンに似ていて、オブジェクトイニシャライザの開始ではありません。 (JavaScriptが表現の完全成る文ですExpressionStatement、という概念を持っているので、あなたも、それをその時点での発現を与えることができます。)

しかし、あなたのvar a={}.toString();コードで

は、 {}.toString()が右側に表示されます - パーサーが という式を期待している、assigmentの手元側のステートメントではありません。したがって、 {はオブジェクトイニシャライザを開始します。

あなたはパーサを作るために何かをする代わりに式を期待している場合、それはあまりにもコンソールでうまくいく:。

({}).toString(); // "[object Object]" 

または

+{}.toString(); // NaN, because the `+` tries to turn `[object Object]` into a number and fails 
関連する問題