36

この jsfiddleで示されているように、JS ファイルがあり、それを使用せずに JSON オブジェクトを作成すると、キー (メンバー) が引用符で囲まれているかどうかによって動作が異なります。

有効なコード:{ a: 1};
無効なコード:{ "a": 1 };

エラー メッセージが表示されます (Chrome では、FF/IE とは異なりますが、構文で失敗します)。

キャッチされない SyntaxError: 予期しないトークン:

ただし、オブジェクトを何らかの方法で使用すると、たとえば、alert({ "a": 1 });すべてが再び OK になります。

なぜこれが起こるのですか?

4

3 に答える 3

62

ステートメント:

{ a: 1 };

オブジェクトリテラルではありません。これは、1 つのラベル付き式を含むブロック ステートメントです。有効です。

これ:

{ "a": 1 };

解析できないため、構文エラーです。引用符で囲まれた "a" はブロック内で式ステートメントを開始しますが、文字列の後の次のトークンはコロンであり、式の後にコロンが続くように見える式形式はありません。

今:

var x = { "a": 1 };

「{」はブロックステートメントの開始として解釈されないため、機能します。そのステートメントは で始まるvarので、変数宣言です。「=」トークンの右側の式内で、「{」が意味できる唯一のことは、オブジェクト リテラルの開始です。同様に、次の点に注意してください。

({ "a": 1 });

開き括弧によってパーサーがネストされた部分式を予期するようになるため、「{」はオブジェクト リテラルの開始であることを明確に意味します。

于 2012-04-09T22:15:32.993 に答える
3

経由で JSON をロードしrequire、ファイル名が終わらない場合よりも、.jsonこのエラーが発生することに気付きました。ファイルの名前を変更するbla.jsonと、正常に動作します。

于 2016-07-30T22:18:35.590 に答える
2

jsonpこのエラーは、必要のないときにjQuery AJAX 呼び出しを行うときにポップアップする可能性がjsonpあります。これが通常の場合は、AJAX 呼び出しでデータ型を切り替えてみてくださいjson

$.ajax({
     dataType: 'json', // try using json rather than json p
     ...
});
于 2015-10-09T00:21:31.473 に答える