【问题标题】:JSON object != JavaScript object? [duplicate]JSON 对象!= JavaScript 对象? [复制]
【发布时间】:2014-01-10 19:30:16
【问题描述】:

为方便起见,我编写了一个简单的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 有哪些不了解?

【问题讨论】:

标签: javascript json javascript-engine to-json object-equality


【解决方案1】:

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;
}

【讨论】:

  • 谢谢,这看起来很简单。 stack-based underscore one 性能更高吗?
  • 这两种方法都进行递归压缩,一般来说两种情况的时间复杂度都是log(n)。
【解决方案2】:

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

_.isEqual(v0, v1);

【讨论】:

  • 哦,好吧,不知道 JavaScript 中不支持开箱即用的深度比较运算符。将考虑使用,例如this.
  • 这不是深度比较。如果两个对象是同一个对象,则它们相等。一件事是比较对象,另一件事是比较值(这是_.isEqual所做的)。
  • 谢谢,我很容易就能在我的范围内使用下划线。
  • 来自 isEqual 上的下划线 API 文档:在两个对象之间执行优化的深度比较,以确定它们是否应该被视为相等。
【解决方案3】:

仅仅因为您拥有相同的内容,并不意味着您拥有相同的对象实例。 如果你已经完成了v1 = v0 而不是单独初始化v1,那么前两个将返回true。

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

【讨论】:

  • 我从 HTTP GET 请求中得到v0;并进行测试以确保我从 HTTP GET 得到的结果符合我的期望。
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 2012-03-22
  • 2015-01-02
  • 2016-09-02
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多