| Leo Repp | 58b9f11 | 2021-11-22 11:57:47 +0100 | [diff] [blame^] | 1 | var Stack = require('./_Stack'), |
| 2 | equalArrays = require('./_equalArrays'), |
| 3 | equalByTag = require('./_equalByTag'), |
| 4 | equalObjects = require('./_equalObjects'), |
| 5 | getTag = require('./_getTag'), |
| 6 | isArray = require('./isArray'), |
| 7 | isBuffer = require('./isBuffer'), |
| 8 | isTypedArray = require('./isTypedArray'); |
| 9 | |
| 10 | /** Used to compose bitmasks for value comparisons. */ |
| 11 | var COMPARE_PARTIAL_FLAG = 1; |
| 12 | |
| 13 | /** `Object#toString` result references. */ |
| 14 | var argsTag = '[object Arguments]', |
| 15 | arrayTag = '[object Array]', |
| 16 | objectTag = '[object Object]'; |
| 17 | |
| 18 | /** Used for built-in method references. */ |
| 19 | var objectProto = Object.prototype; |
| 20 | |
| 21 | /** Used to check objects for own properties. */ |
| 22 | var hasOwnProperty = objectProto.hasOwnProperty; |
| 23 | |
| 24 | /** |
| 25 | * A specialized version of `baseIsEqual` for arrays and objects which performs |
| 26 | * deep comparisons and tracks traversed objects enabling objects with circular |
| 27 | * references to be compared. |
| 28 | * |
| 29 | * @private |
| 30 | * @param {Object} object The object to compare. |
| 31 | * @param {Object} other The other object to compare. |
| 32 | * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
| 33 | * @param {Function} customizer The function to customize comparisons. |
| 34 | * @param {Function} equalFunc The function to determine equivalents of values. |
| 35 | * @param {Object} [stack] Tracks traversed `object` and `other` objects. |
| 36 | * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
| 37 | */ |
| 38 | function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { |
| 39 | var objIsArr = isArray(object), |
| 40 | othIsArr = isArray(other), |
| 41 | objTag = objIsArr ? arrayTag : getTag(object), |
| 42 | othTag = othIsArr ? arrayTag : getTag(other); |
| 43 | |
| 44 | objTag = objTag == argsTag ? objectTag : objTag; |
| 45 | othTag = othTag == argsTag ? objectTag : othTag; |
| 46 | |
| 47 | var objIsObj = objTag == objectTag, |
| 48 | othIsObj = othTag == objectTag, |
| 49 | isSameTag = objTag == othTag; |
| 50 | |
| 51 | if (isSameTag && isBuffer(object)) { |
| 52 | if (!isBuffer(other)) { |
| 53 | return false; |
| 54 | } |
| 55 | objIsArr = true; |
| 56 | objIsObj = false; |
| 57 | } |
| 58 | if (isSameTag && !objIsObj) { |
| 59 | stack || (stack = new Stack); |
| 60 | return (objIsArr || isTypedArray(object)) |
| 61 | ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) |
| 62 | : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); |
| 63 | } |
| 64 | if (!(bitmask & COMPARE_PARTIAL_FLAG)) { |
| 65 | var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), |
| 66 | othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); |
| 67 | |
| 68 | if (objIsWrapped || othIsWrapped) { |
| 69 | var objUnwrapped = objIsWrapped ? object.value() : object, |
| 70 | othUnwrapped = othIsWrapped ? other.value() : other; |
| 71 | |
| 72 | stack || (stack = new Stack); |
| 73 | return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); |
| 74 | } |
| 75 | } |
| 76 | if (!isSameTag) { |
| 77 | return false; |
| 78 | } |
| 79 | stack || (stack = new Stack); |
| 80 | return equalObjects(object, other, bitmask, customizer, equalFunc, stack); |
| 81 | } |
| 82 | |
| 83 | module.exports = baseIsEqualDeep; |