{a:1} diving 1と{a:1、b:2}のタイピングの動作は何ですか?
-
03-10-2019 - |
質問
以下には、Firebugまたはinで表示されます jsconsole.com または他のJavaScriptインタラクティブコンソールで:
>>> foo = { a : 1, b : 2.2 }
Object { a=1, more...}
>>> foo.a
1
>>> foo.b
2.2
>>> { a : 1, b : 2.2 }
SyntaxError: invalid label { message="invalid label", more...}
>>> { a : 1 }
1
なぜですか 1
戻ってきます {a : 1}
そして、なぜそうです {a : 1, b : 2.2}
エラーを与えますか? Rubyでは、あなたがそれを定義したのと同じように戻ってきます。
解決
2行目はあなたに与えることです SyntaxError
なぜなら {
それの最初のトークンはあいまいさを引き起こし、パーサーはそれがあたかもそれがそうであるかのようにそれを扱います ブロックステートメント, 、文字通りのオブジェクトの始まりではありません。
たとえば、有効なブロックステートメント:
{ foo: 'bar' }
上記 ルックス リテラルのようなものですが、コードが評価されているためではありません ステートメントコンテキスト.
それはブロックとして解析され、それは ラベル付けされたステートメント (foo
)、次に式の声明が続きます('bar'
).
文字通りのオブジェクトの文法を使用していることを確認するには、括弧で包むことができます( グループオペレーター):
({ foo: 'bar' })
グループオペレーターは表現のみをとることができるため、あいまいさはありません。
参照:
他のヒント
私は100%ポジティブではありませんが、私が起こっていると思うのは、2行目ではオブジェクトではなくブロックを定義しているということです。したがって、分割誤差は、セミカラーが予想されるため、パーサーがコンマに到達するときに発生します。定義されたラベルは、gotoまたはswitchステートメントのようにラベルです。この説明が理にかなっていることを願っています。
コンソールは評価として( 'you input')
eval({....}) --- this will get an error
eval('({....})')---eval string as a function