| var Stack = require('./_Stack'), |
| equalArrays = require('./_equalArrays'), |
| equalByTag = require('./_equalByTag'), |
| equalObjects = require('./_equalObjects'), |
| getTag = require('./_getTag'), |
| isArray = require('./isArray'), |
| isBuffer = require('./isBuffer'), |
| isTypedArray = require('./isTypedArray'); |
| |
| /** Used to compose bitmasks for value comparisons. */ |
| var COMPARE_PARTIAL_FLAG = 1; |
| |
| /** `Object#toString` result references. */ |
| var argsTag = '[object Arguments]', |
| arrayTag = '[object Array]', |
| objectTag = '[object Object]'; |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * A specialized version of `baseIsEqual` for arrays and objects which performs |
| * deep comparisons and tracks traversed objects enabling objects with circular |
| * references to be compared. |
| * |
| * @private |
| * @param {Object} object The object to compare. |
| * @param {Object} other The other object to compare. |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
| * @param {Function} customizer The function to customize comparisons. |
| * @param {Function} equalFunc The function to determine equivalents of values. |
| * @param {Object} [stack] Tracks traversed `object` and `other` objects. |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
| */ |
| function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { |
| var objIsArr = isArray(object), |
| othIsArr = isArray(other), |
| objTag = objIsArr ? arrayTag : getTag(object), |
| othTag = othIsArr ? arrayTag : getTag(other); |
| |
| objTag = objTag == argsTag ? objectTag : objTag; |
| othTag = othTag == argsTag ? objectTag : othTag; |
| |
| var objIsObj = objTag == objectTag, |
| othIsObj = othTag == objectTag, |
| isSameTag = objTag == othTag; |
| |
| if (isSameTag && isBuffer(object)) { |
| if (!isBuffer(other)) { |
| return false; |
| } |
| objIsArr = true; |
| objIsObj = false; |
| } |
| if (isSameTag && !objIsObj) { |
| stack || (stack = new Stack); |
| return (objIsArr || isTypedArray(object)) |
| ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) |
| : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); |
| } |
| if (!(bitmask & COMPARE_PARTIAL_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; |
| |
| stack || (stack = new Stack); |
| return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); |
| } |
| } |
| if (!isSameTag) { |
| return false; |
| } |
| stack || (stack = new Stack); |
| return equalObjects(object, other, bitmask, customizer, equalFunc, stack); |
| } |
| |
| module.exports = baseIsEqualDeep; |