6

为方便起见,我编写了一个简单的toJSON原型,用于处理我认为安全的 JSON:

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

我在测试我的网络服务时使用它。不幸的是,即使有这个简单的测试:

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,那么前两个将返回 true。

更新:如果您需要比较两个实例以查找它们是否具有相同的内容,那么您需要定义一个比较每个成员的函数。

于 2013-12-22T11:42:09.170 回答
2

JavaScript 中的对象,就像除了原语(int,string,Boolean)之外的所有其他东西一样,是一个引用。

有 2 个不同的重复对象,意味着有 2 个不同的引用指向炒作中的不同位置。

你可以实现一些简单的东西,基本上迭代一个对象的所有原始属性,并一一比较它们:

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

对于两个对象 == 他们必须是同一个实例。v0 和 v1 是两个不同的实例。如果您想对对象进行深入比较,可以使用类似下划线的 isEqual 方法:http ://underscorejs.org/#isEqual

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