JSON对象!= JavaScript对象?

A T*_*A T 6 javascript json javascript-engine object-equality to-json

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

String.prototype.toJSON = function () {
    return JSON.parse(this.valueOf());
};
Run Code Online (Sandbox Code Playgroud)

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

var v0 = '{"echo":"hello_world"}'.toJSON(), v1 = {"echo": "hello_world"};
Run Code Online (Sandbox Code Playgroud)

它失败:

console.log(v0 == v1);            // false
console.log(v0 === v1);           // false
console.log(v0.echo == v1.echo);  // true
console.log(v0.echo === v1.echo); // true
Run Code Online (Sandbox Code Playgroud)

我不知道导致这个问题的JavaScript是什么?

Ole*_*sov 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;
}
Run Code Online (Sandbox Code Playgroud)