JS_javascript スキルの JSON 文字列を解析する Eval に関する小さな問題

WBOY
リリース: 2016-05-16 15:14:31
オリジナル
1572 人が閲覧しました

私は以前、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);
ログイン後にコピー
実行後に「hello world」がポップアップ表示されます。 str 変数を「noString」に変更します。大まかなアプローチは、外側の引用符を削除し、内部調整 (エスケープなど) を行うことです。

となります。

alert('hello world')
ログイン後にコピー
とても良いです!これは正常に動作する JavaScript ステートメントです。実行してください!

元の質問に戻りますが、なぜ JSON 文字列を括弧で囲む必要があるのでしょうか?追加しない場合は次のようになります:

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
ログイン後にコピー
エラーが報告されました。エラーが報告されるのはなぜですか? str "noString" を変換して実行してみてください:

{"name": "hanzichi", "age": 10}; // Uncaught SyntaxError: Unexpected token :
ログイン後にコピー
JSON オブジェクトやオブジェクトが実行可能な JavaScript ステートメントではないことは疑いの余地がありません。待って、次のコードを試してください:

var str = '{name: "hanzichi"}';
var obj = eval(str);
console.log(obj); // hanzichi
ログイン後にコピー
これは一体何ですか?しかし、名前に「」を追加するとエラーが返されますか?

var str = '{"name": "hanzichi"}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
console.log(obj); 
ログイン後にコピー
わかりました、私はほとんどめまいを感じています。実際、「nostring」str を実行して、それが正しく実行できる JavaScript ステートメントかどうかを確認することができます。前者の結果は次のようになります:

{name: "hanzichi"}
ログイン後にコピー
これは確かに合法的な JavaScript ステートメントです。 {} これは、if ステートメントや for ステートメントなどのシナリオだけでなく、いつでも使用できます。これは、ES6 より前の JavaScript にはブロックレベルのスコープしかなく、スコープと競合することがなかったためです。 {} を削除すると、name: "hanzichi" も正当なステートメントになります。 label ステートメントは、ネストされたループから抜け出すのに非常に便利です。詳しくは、label ステートメントのマークを参照してください。 、名前は、使用されていない場合でも、JavaScript コード内のどこにでも配置できます。

オブジェクトに {name: "hanzichi", age: 10} などの 2 つのキーがあると、ラベル ステートメントは 2 つありますか? 「半日」と「10」をそれぞれステートメントとして扱いますが、ステートメントはシール番号でのみ接続できます。 (式の間にはカンマのみを使用できます)。したがって、次のように変更しても問題ありません:

var str = '{name: "hanzichi"; age: 10}';
var obj = eval(str); 
console.log(obj); // 10
ログイン後にコピー
さらに進めば進むほど、記事冒頭のコードのエラーの原因が判明しましたが、なぜ括弧を付けることで解決できるのでしょうか。簡単に言えば、() はステートメントをステートメント式と呼ばれる式に変換します。括弧内のコードは式評価に変換されて返されます。オブジェクト リテラルは式として存在する必要があります。

この記事では式については説明しません。式については、記事の最後にあるリンクを参照してください。式には常に戻り値があることを覚えておく価値があります。ほとんどの式は () で囲まれ、括弧を空にすることはできません。カンマで区切られた複数の式 (いわゆるカンマ式) がある場合は、最後の式の値が返されます。

上記は、JS での JSON 文字列の Eval 解析についてエディターが紹介した小さな問題です。皆さんのお役に立てれば幸いです。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート