code: function objectEqual(a, b, m) {
    if (!isValue(a) || !isValue(b)) {
      return false;
    }
  
    if (a.prototype !== b.prototype) {
      return false;
    }
  
    var i;
    if (m) {
      for (i = 0; i < m.length; i++) {
        if ((m[i][0] === a && m[i][1] === b)
        ||  (m[i][0] === b && m[i][1] === a)) {
          return true;
        }
      }
    } else {
      m = [];
    }
  
    try {
      var ka = enumerable(a);
      var kb = enumerable(b);
    } catch (ex) {
      return false;
    }
  
    ka.sort();
    kb.sort();
  
    if (!iterableEqual(ka, kb)) {
      return false;
    }
  
    m.push([ a, b ]);
  
    var key;
    for (i = ka.length - 1; i >= 0; i--) {
      key = ka[i];
      if (!deepEqual(a[key], b[key], m)) {
        return false;
      }
    }
  
    return true;
  }
docs: /*!
  Recursively check the equality of two objects.
  Once basic sameness has been established it will
  defer to `deepEqual` for each enumerable key
  in the object.
  
  @param {Mixed} a
  @param {Mixed} b
  @return {Boolean} result