time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

_baseIsEqualDeep.js (3010B)


      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;