15

以下は、Firebug または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 では、定義したのと同じ方法で返されます。

4

3 に答える 3

25

2行目は、先頭のトークンがあいまいさを引き起こしているため、パーサーはSyntaxErrorオブジェクトリテラルの先頭ではなく、ブロックステートメントであるかのように扱います。{

たとえば、有効な Block ステートメントは次のとおりです。

{ foo: 'bar' }

上記はオブジェクト リテラルのように見えますが、コードはstatement contextで評価されるため、そうではありません。

これは、ラベル付きステートメント( foo) とそれに続く式ステートメント ( )を含むブロックとして解析されます'bar'

オブジェクト リテラルの文法を使用していることを確認するには、括弧で囲みます (グループ化演算子とも呼ばれます)。

({ foo: 'bar' })

グループ化演算子は式のみを取ることができるため、あいまいさはありません。

以下も参照してください。

于 2010-09-17T00:12:27.047 に答える
0

私は 100% 肯定的ではありませんが、2 行目でオブジェクトではなくブロックを定義していると思います。したがって、パーサーがセミカラーを想定しているため、パーサーがコンマに達すると解析エラーが発生します。定義されたラベルは、goto または switch ステートメントのようなラベルです。この説明が少しでも理解できることを願っています。

于 2010-09-17T00:25:23.730 に答える
-1

console do as eval('you input')

eval({....}) --- this will get an error
eval('({....})')---eval string as a function
于 2010-09-17T00:29:36.267 に答える