Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON对象!=JavaScript对象?_Javascript_Json_Javascript Engine_To Json_Object Equality - Fatal编程技术网

JSON对象!=JavaScript对象?

JSON对象!=JavaScript对象?,javascript,json,javascript-engine,to-json,object-equality,Javascript,Json,Javascript Engine,To Json,Object Equality,为了方便起见,我编写了一个简单的toJSON原型,用于处理我知道是安全的JSON: String.prototype.toJSON = function () { return JSON.parse(this.valueOf()); }; 我正在使用它来测试我的web服务。不幸的是,即使使用这个简单的测试: var v0 = '{"echo":"hello_world"}'.toJSON(), v1 = {"echo": "hello_world"}; 它失败了: console.l

为了方便起见,我编写了一个简单的
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,我有什么不知道的吗?

仅仅因为您拥有相同的内容,并不意味着您拥有相同的对象实例。 如果您分别执行了
v1=v0
而不是初始化
v1
,则前两个将返回true


更新:如果需要比较两个实例以确定它们的内容是否相等,则需要定义一个函数来比较每个成员。

对于两个对象,它们必须是相同的实例。v0和v1是两个不同的实例。如果要对对象进行深入比较,可以使用类似下划线的isEqual方法:


JavaScript中的对象与除原语(int、string、Boolean)之外的所有其他对象一样,都是引用

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

您可以实现这样简单的功能,基本上迭代对象的所有基本属性,并逐个进行比较:

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

“toJSON”实际上是在做“fromJSON”。请参阅:可能的重复:
{a:1}!=={a:1}
。两个物体是一样的。。。如果它们是同一个,并指向堆中的同一个对象;然后做一个测试,确保我从HTTP get得到的符合我的期望。哦,好吧,我不知道JavaScript中不支持开箱即用的深度比较运算符。将考虑使用,例如,它不是关于深度比较。如果两个对象是同一对象,则它们相等。一件事是比较对象,另一件事是比较值(这是u.isEqual所做的)。谢谢,我很容易就能让下划线在我的范围内工作。从isEqual上的下划线API文档:在两个对象之间执行优化的深度比较,以确定它们是否应该被视为相等。谢谢,这看起来相当简单。性能是否更高?这两种方法都进行递归压缩,一般来说,这两种方法的时间复杂度都是log(n)。
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;
}