JSにおけるEval解析JSON文字列の小さな問題

3125 ワード

前にJSONに関する紹介記事を書きましたが、JSONの解析について触れました.私達はすべて知っていて、高級なブラウザーはJSON.parse()APIでJSON文字列をJSONデータに解析して、少し適切でない方法、私達はeval()関数を使うことができます.
JSON(JavaScript Object Notation)は簡単なデータフォーマットで、xmlより軽いです.JSONはJavaScript原生フォーマットであり、これはJavaScriptでJSONデータを処理するために特別なAPIやツールバッグが必要ではないことを意味する.
JSONのルールは簡単です.対象は無秩序な「名前/値」セットです.一つのオブジェクトは「{」(左括弧)で始まり、「}」(右括弧)で終了します.各「名称」の後に「:」(コロン);「名前/値'ペア」の間に「,」(コンマ)で区切られます.

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval('(' + str + ')');
console.log(obj); // Object {name: "hanzichi", age: 10}
eval()に参加する時、str変数の外に小さい括弧を巻いていますか?なぜこのようにしますか?
まずeval関数の定義と使用を見てみます.
eval()のパラメータは文字列です.文字列が表式を表している場合、eval()は表式を求めます.パラメータが1つ以上のJavaScript宣言を表している場合、eval()は声明を実行します.eval()を演算式のための値を求めないでください.JavaScriptは演算式のために自動的に値を求めます.
簡単に言えば、eval関数のパラメータは文字列であり、文字列「nostring」を処理すれば、通常実行可能なJavaScript文になります.
どういうことですか?くりを挙げると、次のようなコードがあります.

var str = "alert('hello world')";
eval(str);
実行後に「ハローワールド」をイジェクトします.私達はstr変数の「nostring」を溶かして、乱暴な点を取る方法は外の引用符を取り除くことです.内部調整(転義など)、そして次のようになります.

alert('hello world')
very good!これは正常に実行できるJavaScript文です.実行します
もう一度最初の問題に戻ります.なぜJSON文字列は括弧を巻きますか?入れないなら、このような形です.

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
はい、間違えました.どうして間違えたのですか?str「noStering」を溶かしてみて、実行してみます.

{"name": "hanzichi", "age": 10}; // Uncaught SyntaxError: Unexpected token :
間違いなく、JSONオブジェクトまたはオブジェクトは、JavaScriptステートメントを実行することができます!など、以下のコードを試してみます.

var str = '{name: "hanzichi"}';
var obj = eval(str);
console.log(obj); // hanzichi
これはまた何の幽霊ですか?しかし、nameに「」を付けてまた間違えましたか?

var str = '{"name": "hanzichi"}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
console.log(obj); 
はい、気絶します.実はstrの「nostring」化ができます.正確に実行できるJavaScript文があるかどうか見てください.前者の結果は:

{name: "hanzichi"}
これは確かに合法的なJavaScript文です.{}私たちはif、for文などのシーンだけでなく、いつでもいいです.ES 6の前にJavaScriptはブロックレベルの機能領域しかないので、スコープなどに対して衝突がありません.削除した後name:"hazchi"も合法的な語句で、一つのlabel語句、label語句は入れ子を飛び出す循環の中でとても使いやすくて、具体的にlabel語句の標識として、nameは引用符を持つことができないので、マークはJavaScriptコードのいかなる位置に置くことができて、使えなくても大丈夫です.
一度は、オブジェクトが二つのkeyを持っていると、{name:"hanzinchi"、age:10'、ok、二つのlabel文?「hanzhichi」と10をそれぞれ語句とみなしていますが、文の間は閉じた記号でしか接続できません.(コンマで表現できる)だから次のように変更しても大丈夫です.

var str = '{name: "hanzichi"; age: 10}';
var obj = eval(str); 
console.log(obj); // 10
話が遠いほど、文章の先頭のコードの間違いの原因は見つけました.なぜ括弧をはめたら解決できますか?簡単に言えば、()は語句を表現に変換して、ステートメント表現と呼びます.括弧内のコードは表式の値を求めて返されます.オブジェクトの文字列の量は表式として必ず存在します.
ここでは、表現については、文末リンクを参照してください.覚えておくべき点は、表式には常に返す値があります.大部分の表式は()に包まれます.小かっこは空ではなく、複数の表式があれば、カンマで区切られます.いわゆるカンマ表現は最後の値を返します.
以上はJSのEval解析JSON文字列の小さな問題を紹介しました.皆さんの助けになりたいです.