docs: function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {
      var objIsArr = isArray(object),
          othIsArr = isArray(other),
          objTag = arrayTag,
          othTag = arrayTag;
  
      if (!objIsArr) {
        objTag = objectToString.call(object);
        objTag = objTag == argsTag ? objectTag : objTag;
      }
      if (!othIsArr) {
        othTag = objectToString.call(other);
        othTag = othTag == argsTag ? objectTag : othTag;
      }
      var objIsObj = objTag == objectTag && !isHostObject(object),
          othIsObj = othTag == objectTag && !isHostObject(other),
          isSameTag = objTag == othTag;
  
      stack || (stack = []);
      var stacked = find(stack, function(entry) {
        return entry[0] === object;
      });
      if (stacked && stacked[1]) {
        return stacked[1] == other;
      }
      stack.push([object, other]);
      if (isSameTag && !objIsObj) {
        var result = (objIsArr)
          ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)
          : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);
        stack.pop();
        return result;
      }
      if (!(bitmask & PARTIAL_COMPARE_FLAG)) {
        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
  
        if (objIsWrapped || othIsWrapped) {
          var objUnwrapped = objIsWrapped ? object.value() : object,
              othUnwrapped = othIsWrapped ? other.value() : other;
  
          var result = equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);
          stack.pop();
          return result;
        }
      }
      if (!isSameTag) {
        return false;
      }
      var result = equalObjects(object, other, equalFunc, customizer, bitmask, stack);
      stack.pop();
      return result;
    }