UNPKG

2.52 kBJavaScriptView Raw
1"use strict";
2var typeObj = require("../lang/isType");
3var isFunction = typeObj.isFunction;
4var toString = Object.prototype.toString;
5function eq(a, b, aStack, bStack) {
6 if (a === b)
7 return a !== 0 || 1 / a === 1 / b;
8 if (a == null || b == null)
9 return false;
10 if (a !== a)
11 return b !== b;
12 if (typeof a !== 'function' && typeof a !== 'object' && typeof b != 'object')
13 return false;
14 return deepEqual(a, b, aStack, bStack);
15}
16function deepEqual(a, b, aStack, bStack) {
17 if (aStack === void 0) { aStack = []; }
18 if (bStack === void 0) { bStack = []; }
19 var className = toString.call(a);
20 if (className !== toString.call(b))
21 return false;
22 switch (className) {
23 case '[object RegExp]':
24 case '[object String]':
25 return '' + a === '' + b;
26 case '[object Number]':
27 if (+a !== +a)
28 return +b !== +b;
29 return +a === 0 ? 1 / +a === 1 / b : +a === +b;
30 case '[object Date]':
31 case '[object Boolean]':
32 return +a === +b;
33 case '[object Symbol]':
34 return Symbol.prototype.valueOf.call(a) === Symbol.prototype.valueOf.call(b);
35 }
36 var areArrays = className === '[object Array]';
37 if (!areArrays) {
38 if (typeof a != 'object' || typeof b != 'object')
39 return false;
40 var aCtor = a.constructor;
41 var bCtor = b.constructor;
42 if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor
43 && isFunction(bCtor) && bCtor instanceof bCtor)) {
44 return false;
45 }
46 }
47 var length = aStack.length;
48 while (length--) {
49 if (aStack[length] === a)
50 return bStack[length] === b;
51 }
52 aStack.push(a);
53 bStack.push(b);
54 if (areArrays) {
55 var length_1 = a.length;
56 if (length_1 !== b.length)
57 return false;
58 while (length_1--) {
59 if (!eq(a[length_1], b[length_1], aStack, bStack))
60 return false;
61 }
62 }
63 else {
64 var keys = Object.keys(a);
65 var key = void 0;
66 var length_2 = keys.length;
67 if (Object.keys(b).length !== length_2)
68 return false;
69 while (length_2--) {
70 key = keys[length_2];
71 if (!(b.hasOwnProperty(key) && eq(a[key], b[key], aStack, bStack)))
72 return false;
73 }
74 }
75 aStack.pop();
76 bStack.pop();
77 return true;
78}
79module.exports = eq;
80//# sourceMappingURL=eq.js.map
\No newline at end of file