code: function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
      switch (tag) {
  
        case boolTag:
        case dateTag:
          // Coerce dates and booleans to numbers, dates to milliseconds and
          // booleans to `1` or `0` treating invalid dates coerced to `NaN` as
          // not equal.
          return +object == +other;
  
        case errorTag:
          return object.name == other.name && object.message == other.message;
  
        case numberTag:
          // Treat `NaN` vs. `NaN` as equal.
          return (object != +object) ? other != +other : object == +other;
  
        case regexpTag:
        case stringTag:
          // Coerce regexes to strings and treat strings, primitives and objects,
          // as equal. See http://www.ecma-international.org/ecma-262/6.0/#sec-regexp.prototype.tostring
          // for more details.
          return object == (other + '');
  
      }
      return false;
    }
docs: A specialized version of `baseIsEqualDeep` for comparing objects of
  the same `toStringTag`.
  
  **Note:** This function only supports comparing values with tags of
  `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
  
  @private
  @param {Object} object The object to compare.
  @param {Object} other The other object to compare.
  @param {string} tag The `toStringTag` of the objects to compare.
  @param {Function} equalFunc The function to determine equivalents of values.
  @param {Function} customizer The function to customize comparisons.
  @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
  for more details.
  @param {Object} stack Tracks traversed `object` and `other` objects.
  @returns {boolean} Returns `true` if the objects are equivalent, else `false`.