deepEqual (a, b) {
    if (a === b) {
      return true
    }
    let _equal = true
    if (utils.isArray(a) && utils.isArray(b)) {
      if (a.length !== b.length) {
        return false
      }
      for (let i = a.length; i--;) {
        if (!utils.deepEqual(a[i], b[i])) {
          // Exit loop early
          return false
        }
      }
    } else if (utils.isObject(a) && utils.isObject(b)) {
      utils.forOwn(a, function (value, key) {
        if (!(_equal = utils.deepEqual(value, b[key]))) {
          // Exit loop early
          return false
        }
      })
      if (_equal) {
        utils.forOwn(b, function (value, key) {
          if (!(_equal = utils.deepEqual(value, a[key]))) {
            // Exit loop early
            return false
          }
        })
      }
    } else {
      return false
    }
    return _equal
  }
Check whether the two provided objects are deeply equal.

@example
import { utils } from 'js-data';

const objA = {
  name: 'John',
  id: 27,
  nested: {
    item: 'item 1',
    colors: ['red', 'green', 'blue']
  }
};

const objB = {
  name: 'John',
  id: 27,
  nested: {
    item: 'item 1',
    colors: ['red', 'green', 'blue']
  }
};

console.log(utils.deepEqual(a,b)); // true
objB.nested.colors.add('yellow'); // make a change to a nested object's array
console.log(utils.deepEqual(a,b)); // false

@method utils.deepEqual
@param {object} a First object in the comparison.
@param {object} b Second object in the comparison.
@returns {boolean} Whether the two provided objects are deeply equal.
@see utils.equal
@since 3.0.0