Internal method for comparing the equivalence of objects, or object-like items.

@param x The first item to compare.
@param y The second item to compare.
@param rc The running counter for comparing circular references.
@returns {boolean} An indication as to whether or not x and y were equal.
function _compareObject(x, y, rc) {
    if (x === y)
        return true;
    if (x.constructor && y.constructor && x.constructor !== y.constructor)
        return false;
    let xKeys = Object.keys(x);
    let yKeys = Object.keys(y);
    xKeys.sort();
    yKeys.sort();
    if (!_equals(xKeys, yKeys, rc))
        return false;
    rc.push(x, y);
    for (let k in x) {
        if (!_equals(x[k], y[k], rc))
            return false;
    }
    rc.pop();
    return true;
}