私はクロームのdevのツールでそれをしようとすると、それはそれはにを割り当てるときただし Uncaught SyntaxError: Unexpected token .
を示しています{} .toString()キャッチされないでSyntaxError:予期しないトークン
var a={}.toString();
a //[object Object]
?
私はクロームのdevのツールでそれをしようとすると、それはそれはにを割り当てるときただし Uncaught SyntaxError: Unexpected token .
を示しています{} .toString()キャッチされないでSyntaxError:予期しないトークン
var a={}.toString();
a //[object Object]
?
(たとえば、割り当ての右側にあるようにトリガーされる)式コンテキストにない場合、{}
はa block statementであり、オブジェクトリテラルではありません。
パーサーは、{}
をコードブロックとして解釈しています。あなたはそれが括弧で括弧を囲むことにより、正しく解析することができます:
({}).toString();
{}
1枚目の撮影とコールする一切.toString
メソッドを持っていないブロック、と解釈されます。
オブジェクトリテラルを({}).toString()
のように括弧で囲むと、期待どおりに機能します。
これは、構文解析ルールの優先順位と、オブジェクト区画とブロック区切り文字の両方にオーバーロードされる{}
トークンが原因です。
@TJCrowder修正済み(私は編集作業中でしたが、スペック:()を見落としました。 – ssube
ああ、私はこれをやったことはありません... ;-) –
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
を '({})のtoString()' – Redu