Projekt

Obecné

Profil

Stáhnout (3.66 KB) Statistiky
| Větev: | Revize:
1
var Symbol = require('./_Symbol'),
2
    Uint8Array = require('./_Uint8Array'),
3
    eq = require('./eq'),
4
    equalArrays = require('./_equalArrays'),
5
    mapToArray = require('./_mapToArray'),
6
    setToArray = require('./_setToArray');
7

    
8
/** Used to compose bitmasks for value comparisons. */
9
var COMPARE_PARTIAL_FLAG = 1,
10
    COMPARE_UNORDERED_FLAG = 2;
11

    
12
/** `Object#toString` result references. */
13
var boolTag = '[object Boolean]',
14
    dateTag = '[object Date]',
15
    errorTag = '[object Error]',
16
    mapTag = '[object Map]',
17
    numberTag = '[object Number]',
18
    regexpTag = '[object RegExp]',
19
    setTag = '[object Set]',
20
    stringTag = '[object String]',
21
    symbolTag = '[object Symbol]';
22

    
23
var arrayBufferTag = '[object ArrayBuffer]',
24
    dataViewTag = '[object DataView]';
25

    
26
/** Used to convert symbols to primitives and strings. */
27
var symbolProto = Symbol ? Symbol.prototype : undefined,
28
    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
29

    
30
/**
31
 * A specialized version of `baseIsEqualDeep` for comparing objects of
32
 * the same `toStringTag`.
33
 *
34
 * **Note:** This function only supports comparing values with tags of
35
 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
36
 *
37
 * @private
38
 * @param {Object} object The object to compare.
39
 * @param {Object} other The other object to compare.
40
 * @param {string} tag The `toStringTag` of the objects to compare.
41
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
42
 * @param {Function} customizer The function to customize comparisons.
43
 * @param {Function} equalFunc The function to determine equivalents of values.
44
 * @param {Object} stack Tracks traversed `object` and `other` objects.
45
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
46
 */
47
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
48
  switch (tag) {
49
    case dataViewTag:
50
      if ((object.byteLength != other.byteLength) ||
51
          (object.byteOffset != other.byteOffset)) {
52
        return false;
53
      }
54
      object = object.buffer;
55
      other = other.buffer;
56

    
57
    case arrayBufferTag:
58
      if ((object.byteLength != other.byteLength) ||
59
          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
60
        return false;
61
      }
62
      return true;
63

    
64
    case boolTag:
65
    case dateTag:
66
    case numberTag:
67
      // Coerce booleans to `1` or `0` and dates to milliseconds.
68
      // Invalid dates are coerced to `NaN`.
69
      return eq(+object, +other);
70

    
71
    case errorTag:
72
      return object.name == other.name && object.message == other.message;
73

    
74
    case regexpTag:
75
    case stringTag:
76
      // Coerce regexes to strings and treat strings, primitives and objects,
77
      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
78
      // for more details.
79
      return object == (other + '');
80

    
81
    case mapTag:
82
      var convert = mapToArray;
83

    
84
    case setTag:
85
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
86
      convert || (convert = setToArray);
87

    
88
      if (object.size != other.size && !isPartial) {
89
        return false;
90
      }
91
      // Assume cyclic values are equal.
92
      var stacked = stack.get(object);
93
      if (stacked) {
94
        return stacked == other;
95
      }
96
      bitmask |= COMPARE_UNORDERED_FLAG;
97

    
98
      // Recursively compare objects (susceptible to call stack limits).
99
      stack.set(object, other);
100
      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
101
      stack['delete'](object);
102
      return result;
103

    
104
    case symbolTag:
105
      if (symbolValueOf) {
106
        return symbolValueOf.call(object) == symbolValueOf.call(other);
107
      }
108
  }
109
  return false;
110
}
111

    
112
module.exports = equalByTag;
(169-169/571)