Hatena::ブログ(Diary)

130単位

2008-10-22

json.jsとjson2.jsの違い

JavaScriptのとあるコードの修正において、JSONの受け渡しでevalの使用をやめようとした*1ときに調べたメモ。

JSON in JavaScript
http://www.json.org/js.html

http://www.json.org/json2.js

これがメジャーなライブラリのようです。

ふとファイル名の「2」に疑問を持って「json.js」に変えてみたら、そちらも落とせました。で、最初にjson.jsを使ってみたら思うように動きませんでした。json2.jsに変更してみたところ、正常に動きました。

json2.jsには無くて、json.jsのみに存在するのが以下のコード。これが原因だったようです。

if (!Object.prototype.toJSONString) {
    Object.prototype.toJSONString = function (filter) {
        return JSON.stringify(this, filter);
    };
    Object.prototype.parseJSON = function (filter) {
        return JSON.parse(this, filter);
    };
}

調べていた中で見つけたmalaさんの記事で理解することができました。

まず、Object.prototypeにメソッドを生やしてしまうとfor inでキーを列挙するときにいちいちhasOwnPropertyを使わないといけなくなるので普通は使いません。影響が大きすぎるので、よっぽど変態的なライブラリじゃないと使わない。

最速インターフェース研究会 :: JavaScriptにおけるdeep clone

実際にfor inを使っていて、そこで追加されたメソッドの分も回ってしまっていたために動きがおかしくなっていました。

json.jsの中をもう一度詳しく見てみると以下のようなコメントが。

52行目

    This file will break programs with improper for..in loops. See
    http://yuiblog.com/blog/2006/09/26/for-in-intrigue/

523行目

// Augment the basic prototypes if they have not already been augmented.
// These forms are obsolete. It is recommended that JSON.stringify and
// JSON.parse be used instead.

プログラムがおかしくなるかも」とか、「このやり方は時代遅れだ」とか書かれているようです。

というわけで、現状json.jsへのリンクは生きているみたいですけど、よほどのことがない限りは通常のリンク通りにjson2.jsを使うようにしたほうが良さそうです。

*1:好ましくないとされているため

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/deeeki/20081022/jsonjs