00001 var Stack = require('./_Stack'), 00002 equalArrays = require('./_equalArrays'), 00003 equalByTag = require('./_equalByTag'), 00004 equalObjects = require('./_equalObjects'), 00005 getTag = require('./_getTag'), 00006 isArray = require('./isArray'), 00007 isBuffer = require('./isBuffer'), 00008 isTypedArray = require('./isTypedArray'); 00009 00011 var COMPARE_PARTIAL_FLAG = 1; 00012 00014 var argsTag = '[object Arguments]', 00015 arrayTag = '[object Array]', 00016 objectTag = '[object Object]'; 00017 00019 var objectProto = Object.prototype; 00020 00022 var hasOwnProperty = objectProto.hasOwnProperty; 00023 00038 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { 00039 var objIsArr = isArray(object), 00040 othIsArr = isArray(other), 00041 objTag = objIsArr ? arrayTag : getTag(object), 00042 othTag = othIsArr ? arrayTag : getTag(other); 00043 00044 objTag = objTag == argsTag ? objectTag : objTag; 00045 othTag = othTag == argsTag ? objectTag : othTag; 00046 00047 var objIsObj = objTag == objectTag, 00048 othIsObj = othTag == objectTag, 00049 isSameTag = objTag == othTag; 00050 00051 if (isSameTag && isBuffer(object)) { 00052 if (!isBuffer(other)) { 00053 return false; 00054 } 00055 objIsArr = true; 00056 objIsObj = false; 00057 } 00058 if (isSameTag && !objIsObj) { 00059 stack || (stack = new Stack); 00060 return (objIsArr || isTypedArray(object)) 00061 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) 00062 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); 00063 } 00064 if (!(bitmask & COMPARE_PARTIAL_FLAG)) { 00065 var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), 00066 othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); 00067 00068 if (objIsWrapped || othIsWrapped) { 00069 var objUnwrapped = objIsWrapped ? object.value() : object, 00070 othUnwrapped = othIsWrapped ? other.value() : other; 00071 00072 stack || (stack = new Stack); 00073 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); 00074 } 00075 } 00076 if (!isSameTag) { 00077 return false; 00078 } 00079 stack || (stack = new Stack); 00080 return equalObjects(object, other, bitmask, customizer, equalFunc, stack); 00081 } 00082 00083 module.exports = baseIsEqualDeep;