1

JSON を解析するには、ブラウザーでネイティブの JSON サポートを使用するのが最善の方法だと思います。

ネイティブの JSON サポートが利用できない場合に JSON を解析する良い方法を探していました。

https://github.com/douglascrockford/JSON-js/blob/master/json2.jsのコードを見たとき、正規表現を使用してデータが有効な JSON であるかどうかを最初に確認することを理解しました。

if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, '')))

そして、eval() を適用します。

jQuery は、最初に上記の正規表現を使用して $.parseJSON() を実行し、有効な JSON であるかどうかを確認してから適用します。

return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
        (new Function("return " + data))();

ネイティブ JSON が利用可能な場合はそれを使用し、それ以外の場合は「新しい関数」を使用します。

JSON の解析に関数オブジェクトを使用することについて、他に見つけた場所はありません。eval() を使用する方法と関数オブジェクトを使用する方法のどちらが優れていますか? 正確に何を実行するのか説明できます(new Function("return " + data))();か?

4

2 に答える 2

2

new Function("return "+data)この場合、 eval とほぼ同じことを行います。Whereevalは結果を直接返し、(new Function("return "+data))()無名関数を作成して実行します。

new Function私はベンチマークを行っていませんが、関数が最初に作成され、次にコードが評価されるため、eval よりも少し遅いと思います。私の言葉を信じないでください、それは私の脳の思考です。

于 2010-08-26T12:00:30.400 に答える
1

'new Function' は eval() を実行するより安全な方法です。eval を使用すると、スコープ チェーン内のすべての変数が eval されたコードで使用できるようになります。'new Function' ではそうではありません。スコープ チェーン内の変数にはアクセスできません。変数は、渡されたコード文字列と連結する必要があります。

(new Function("return " + data))();

基本的に、「データ」をオブジェクトに変換して返す関数が作成され、最後の括弧 () が関数を即座に呼び出します。作成された関数への参照が作成されないため、ガベージ コレクターは作成された関数をオブジェクト スタックから削除します。

于 2010-08-26T12:03:17.767 に答える