jQuery.parseJSON()について
こんにちは、「検索と発見のためのデザイン」(オライリー・ジャパン)を買いました。同じ著者の「アンビエント・ファインダビリティ」は発見可能性の広い枠組みを考える読み物でしたが、こちらは実際に検索システムをデザインするときの枠組みを提供してくれる本って感じです。
さて、今日はそんなユーザー寄りのデザインの話ではなくjQueryの実装の話です。
jQuery.parseJSON()について
最近のjQueryライブラリには、Ajax通信でサーバーから取得したデータをハッシュ(JavaScriptのオブジェクト)として利用できるようにするためにjQuery.parseJSON() というメソッドがついています。(1.4.1〜)これ以前はXMLHttpRequestの処理とセットになっていて、JSONのパースだけ単体で利用できないようになっていました。(…といってもJSON文字列をevalしているだけだったようですが…)
jquery-1.2.6.js 2896行目
data = eval("(" + data + ")");
jQuery 1.4.4のjQuery.parseJSONの実装の中で実際にオブジェクトに変換する部分は次のようになっています。
jquery-1.4.4.js 579行目
// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
window.JSON.parse( data ) :
(new Function("return " + data))();
ここではまず JSON.parse メソッドの存在をチェックします。最近のFirefoxやChromeには最初からJSON.parseメソッドが利用できるようになっていて、ネイティブコードなので処理も早いみたいです。(計測していません)なので、まずはネイティブのメソッドの実行を試みます。
JSON.parse()が無いときに実行される次の行つまり
(new Function("return " + data))();
ですがどういう意味でしょうか。dataにJSON文字列が入ってくると
(new Function("return " + '{"key":"value"}'))();
となり、このコードを実行してもオブジェクトが得られます。関数を定義即呼び出しているコードです。このnew Function(...)を使った定義のしかたでは関数の実装を文字列として表現できるのでシンプルな書き方ができています。(事前にチェックを行っているようです)
まとめ
とくにありません ;) たまには、使えるユーティリティメソッドがないか調べるため、jQueryのコードを見てみるのもいいかもしれません。