00001 var Symbol = require('./_Symbol'),
00002 Uint8Array = require('./_Uint8Array'),
00003 eq = require('./eq'),
00004 equalArrays = require('./_equalArrays'),
00005 mapToArray = require('./_mapToArray'),
00006 setToArray = require('./_setToArray');
00007
00009 var COMPARE_PARTIAL_FLAG = 1,
00010 COMPARE_UNORDERED_FLAG = 2;
00011
00013 var boolTag = '[object Boolean]',
00014 dateTag = '[object Date]',
00015 errorTag = '[object Error]',
00016 mapTag = '[object Map]',
00017 numberTag = '[object Number]',
00018 regexpTag = '[object RegExp]',
00019 setTag = '[object Set]',
00020 stringTag = '[object String]',
00021 symbolTag = '[object Symbol]';
00022
00023 var arrayBufferTag = '[object ArrayBuffer]',
00024 dataViewTag = '[object DataView]';
00025
00027 var symbolProto = Symbol ? Symbol.prototype : undefined,
00028 symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
00029
00047 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
00048 switch (tag) {
00049 case dataViewTag:
00050 if ((object.byteLength != other.byteLength) ||
00051 (object.byteOffset != other.byteOffset)) {
00052 return false;
00053 }
00054 object = object.buffer;
00055 other = other.buffer;
00056
00057 case arrayBufferTag:
00058 if ((object.byteLength != other.byteLength) ||
00059 !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
00060 return false;
00061 }
00062 return true;
00063
00064 case boolTag:
00065 case dateTag:
00066 case numberTag:
00067
00068
00069 return eq(+object, +other);
00070
00071 case errorTag:
00072 return object.name == other.name && object.message == other.message;
00073
00074 case regexpTag:
00075 case stringTag:
00076
00077
00078
00079 return object == (other + '');
00080
00081 case mapTag:
00082 var convert = mapToArray;
00083
00084 case setTag:
00085 var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
00086 convert || (convert = setToArray);
00087
00088 if (object.size != other.size && !isPartial) {
00089 return false;
00090 }
00091
00092 var stacked = stack.get(object);
00093 if (stacked) {
00094 return stacked == other;
00095 }
00096 bitmask |= COMPARE_UNORDERED_FLAG;
00097
00098
00099 stack.set(object, other);
00100 var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
00101 stack['delete'](object);
00102 return result;
00103
00104 case symbolTag:
00105 if (symbolValueOf) {
00106 return symbolValueOf.call(object) == symbolValueOf.call(other);
00107 }
00108 }
00109 return false;
00110 }
00111
00112 module.exports = equalByTag;