Search code examples
javascriptjsonjavascript-engineto-jsonobject-equality

JSON object != JavaScript object?


For convenience I wrote a simple toJSON prototype, for handling JSON that I know to be safe:

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

I am using it in testing my web-services. Unfortunately even with this simple test:

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

It fails:

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

What do I not know about JavaScript which is causing this issue?


Solution

  • An object in JavaScript, just like everything else except primitives(int, string, Boolean) is a reference.

    Having 2 different duplicate objects, means having 2 different references that point to different places within the hype.

    You can implement something as simple as that, to basically iterate over all of the primitive properties of an object, and compare them one by one:

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