3

Chrome コンソールで JSON オブジェクトを操作しているときに、次の異常な動作に遭遇しました。

> {a:1}
1
> {"a":1}
SyntaxError: Unexpected token :
> b={a:1}
Object
> b={"a":1}
Object

最初のステートメントがオブジェクトではなく 1 を返すのはなぜですか? また、2 番目のステートメントが機能するのはなぜですか? 最初の 2 つのステートメントが最後の 2 つのステートメントと同じ出力を返すことを期待していました。

4

3 に答える 3

1

私の最善の推測は、最初のシナリオで

> {a:1}

中括弧は無視され、はlabelaとして解釈されます。

1入力するだけで同じ値が得られます

> a:1

これが正しければ、2 番目の例は機能しません。なぜなら、二重引用符はラベルで使用できない文字だからです。

3 番目と 4 番目の例は有効な変数割り当てであり、コンソールはオブジェクトをオブジェクトとして理解するため、機能します。

于 2012-12-10T15:05:46.887 に答える
1

JavaScript 式ステートメントを a で開始することはできません{。これは、インタープリターにあいまいさが生じ、ステートメント ブロックと見なされる可能性があるためです。

したがって、これはオブジェクト リテラルではなく、ステートメント ラベルと数値リテラルを含むステートメント ブロックと見なされます。

{a:1}

しかし、これは無効な構文を持つステートメント ブロックと見なされます。"a":

{"a":1}

しかし、これらは . で始まりません{。これらは で始まるb =ため、{はオブジェクト リテラルの開始と見なされます。

b = {a:1}
b = {"a":1}

12.4 式ステートメント

ExpressionStatementは、開き中括弧で開始することはできません。これは、 Block とあいまいになる可能性があるためです。また、FunctionDeclarationとあいまいになる可能性があるため、 ExpressionStatementfunctionをキーワードで開始することはできません。


これは、式ステートメントを別の文字で開始して有効にするだけでよいことを意味します。

たとえば、かっこで囲むと、次のように機能します。

({"a": 1})
于 2012-12-10T15:06:21.457 に答える
1

Chrome はコンソール入力を次のように評価します。

with ((window && window.console && window.console._commandLineAPI) || {}) {
    <your code here>
};

これにより、{ }ブラケットが余分なブロック スコープ ブラケットと見なされ、無視されるようになります。

次に、私たちを導きます

a:1// 1

ラベルとして見る

a={a:1}

正しい割り当てとして

編集:

これは、このJSBinでJSLintが言っていることでもあります

于 2012-12-10T15:09:49.583 に答える