1

evalsを使用して古いコードのバグを修正していたとき、式の評価について本当に奇妙なことに気づきました。

JavaScriptコンソールを開いて、次のように入力した場合

eval ('{"a": "b"}')

また

{"a": "b"}

あなたが得る

SyntaxError: Unexpected token :

しかし、あなたがタイプした場合

var o = {"a": "b"};

ステートメントは、期待できる結果で実行されます。

また、入力した場合

(function() {return {"a": "b"};})()

あなたが得る:

Object {a: "b"}

また、と入力{a: "b"}すると「b」が表示されます。全くわかりません。

私はそれがvar o = {"a": "b"};「式を評価し{"a": "b"}、結果をに割り当てる」という意味だと思っていましたo

しかし、どうやらそれはそれよりも複雑です。その点についての説明を言語仕様で見つけようとしていますが、正しい表現で検索しているとは思いません。

それ自体では有効な評価可能な式ではないものの値を変数に返す、または割り当てることができる理由について、誰かが手がかりを提供できますか?

4

3 に答える 3

5

その理由は、中括弧がJavascriptで2つの目的に使用されているためです。中括弧は、オブジェクトリテラルを囲み、コードブロックも囲みます。

コンソールとeval中括弧はコードブロックの開始として解釈されますが、代わりにオブジェクトリテラルを入力しています。これがエラーの原因です。

于 2013-02-27T21:10:14.573 に答える
2

いいえ、書き込みとは、「値が。var o = {"a":"b"}という名前の1つのメンバーでオブジェクトを作成し、このオブジェクトをローカル変数の値として割り当てる」ことを意味します。abo

角かっこは式の評価とは関係がなく、JavaScriptでオブジェクト表記に使用されます。

var a = {
   foo:1,
   baz:2
}

console.log(a.foo);
console.log(a.baz);

これは出力します:

1
2

JSオブジェクト表記。

于 2013-02-27T21:09:27.243 に答える
2

あなたが使用することができます

eval('({"a":"b"})'); // mind the parens

それらが必要な理由は、次の回答で説明されているのと同じです: JavaScript オブジェクト/関数/クラス宣言を囲む括弧は何を意味しますか?

おそらく適切な JSON 解析を使用したいでしょうが: JSON.parse(str).

于 2013-02-27T21:17:31.013 に答える