6

便宜上toJSON、安全であることがわかっている JSON を処理するための簡単なプロトタイプを作成しました。

String.prototype.toJSON = function () {
    return JSON.parse(this.valueOf());
};

Web サービスのテストに使用しています。残念ながら、この簡単なテストでも:

var v0 = '{"echo":"hello_world"}'.toJSON(), v1 = {"echo": "hello_world"};

失敗します:

console.log(v0 == v1);            // false
console.log(v0 === v1);           // false
console.log(v0.echo == v1.echo);  // true
console.log(v0.echo === v1.echo); // true

この問題の原因となっている JavaScript について、私が知らないことは何ですか?

4

3 に答える 3

3

コンテンツが同じだからといって、オブジェクト インスタンスが同じであるとは限りません。v1 = v0別々に初期化する代わりに実行した場合v1、最初の 2 つは true を返します。

更新: 2 つのインスタンスを比較して内容が等しいかどうかを確認する必要がある場合は、各メンバーを比較する関数を定義する必要があります。

于 2013-12-22T11:42:09.170 に答える
2

プリミティブ (int、string、Boolean) を除く他のすべてと同様に、JavaScript のオブジェクトは参照です。

2 つの異なる重複オブジェクトを持つということは、ハイプ内の異なる場所を指す 2 つの異なる参照を持つことを意味します。

オブジェクトのすべてのプリミティブ プロパティを基本的に反復処理し、それらを 1 つずつ比較するという単純なものを実装できます。

Object.prototype.equals = function(x)
{
    for(p in this)
    {
        switch(typeof(this[p]))
        {
            case 'object':
                if (!this[p].equals(x[p])) { return false }; break;
            case 'function':
                if (typeof(x[p])=='undefined' || (p != 'equals' && this[p].toString() != x[p].toString())) { return false; }; break;
            default:
                if (this[p] != x[p]) { return false; }
        }
    }

    for(p in x)
    {
        if(typeof(this[p])=='undefined') {return false;}
    }

    return true;
}
于 2013-12-22T11:46:19.003 に答える
1

2 つのオブジェクトが == であるためには、それらは同じインスタンスでなければなりません。v0 と v1 は 2 つの異なるインスタンスです。オブジェクトの詳細な比較を行いたい場合は、アンダースコアの isEqual メソッドのようなものを使用できます: http://underscorejs.org/#isEqual

_.isEqual(v0, v1);
于 2013-12-22T11:44:31.713 に答える