SIGN IN SIGN UP

A modern JavaScript utility library delivering modularity, performance, & extras.

0 0 2042 JavaScript
2016-10-02 21:51:40 -07:00
define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_getTag', './isArray', './isBuffer', './isTypedArray'], function(Stack, equalArrays, equalByTag, equalObjects, getTag, isArray, isBuffer, isTypedArray) {
2015-12-16 17:53:20 -08:00
2016-11-13 22:49:46 -08:00
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1;
2015-01-08 00:37:01 -08:00
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
objectTag = '[object Object]';
2015-12-16 17:53:20 -08:00
/** Used for built-in method references. */
2015-01-08 00:37:01 -08:00
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.
2016-11-13 22:49:46 -08:00
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
2015-01-08 00:37:01 -08:00
* @param {Function} equalFunc The function to determine equivalents of values.
2015-12-16 17:53:20 -08:00
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
2015-01-08 00:37:01 -08:00
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
2016-11-13 22:49:46 -08:00
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
2015-01-08 00:37:01 -08:00
var objIsArr = isArray(object),
othIsArr = isArray(other),
2016-12-19 17:17:56 -06:00
objTag = objIsArr ? arrayTag : getTag(object),
othTag = othIsArr ? arrayTag : getTag(other);
objTag = objTag == argsTag ? objectTag : objTag;
othTag = othTag == argsTag ? objectTag : othTag;
2016-09-17 22:24:52 -07:00
var objIsObj = objTag == objectTag,
othIsObj = othTag == objectTag,
2015-01-08 00:37:01 -08:00
isSameTag = objTag == othTag;
2016-10-02 21:51:40 -07:00
if (isSameTag && isBuffer(object)) {
if (!isBuffer(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
2016-02-29 23:38:21 -08:00
if (isSameTag && !objIsObj) {
stack || (stack = new Stack);
return (objIsArr || isTypedArray(object))
2016-11-13 22:49:46 -08:00
? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
: equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
2015-01-08 00:37:01 -08:00
}
2016-11-13 22:49:46 -08:00
if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
2015-12-16 17:50:42 -08:00
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
2015-01-08 00:37:01 -08:00
2015-12-16 17:50:42 -08:00
if (objIsWrapped || othIsWrapped) {
2016-03-26 00:00:01 -07:00
var objUnwrapped = objIsWrapped ? object.value() : object,
othUnwrapped = othIsWrapped ? other.value() : other;
2016-02-29 23:38:21 -08:00
stack || (stack = new Stack);
2016-11-13 22:49:46 -08:00
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
2015-12-16 17:49:07 -08:00
}
2015-12-16 17:49:35 -08:00
}
if (!isSameTag) {
return false;
2015-01-08 00:37:01 -08:00
}
2015-12-16 17:53:20 -08:00
stack || (stack = new Stack);
2016-11-13 22:49:46 -08:00
return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
2015-01-08 00:37:01 -08:00
}
return baseIsEqualDeep;
});