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 |
|
11 | var COMPARE_PARTIAL_FLAG = 1;
|
12 |
|
13 |
|
14 | var argsTag = '[object Arguments]',
|
15 | arrayTag = '[object Array]',
|
16 | objectTag = '[object Object]';
|
17 |
|
18 |
|
19 | var objectProto = Object.prototype;
|
20 |
|
21 |
|
22 | var hasOwnProperty = objectProto.hasOwnProperty;
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
|
39 | var objIsArr = isArray(object),
|
40 | othIsArr = isArray(other),
|
41 | objTag = arrayTag,
|
42 | othTag = arrayTag;
|
43 |
|
44 | if (!objIsArr) {
|
45 | objTag = getTag(object);
|
46 | objTag = objTag == argsTag ? objectTag : objTag;
|
47 | }
|
48 | if (!othIsArr) {
|
49 | othTag = getTag(other);
|
50 | othTag = othTag == argsTag ? objectTag : othTag;
|
51 | }
|
52 | var objIsObj = objTag == objectTag,
|
53 | othIsObj = othTag == objectTag,
|
54 | isSameTag = objTag == othTag;
|
55 |
|
56 | if (isSameTag && isBuffer(object)) {
|
57 | if (!isBuffer(other)) {
|
58 | return false;
|
59 | }
|
60 | objIsArr = true;
|
61 | objIsObj = false;
|
62 | }
|
63 | if (isSameTag && !objIsObj) {
|
64 | stack || (stack = new Stack);
|
65 | return (objIsArr || isTypedArray(object))
|
66 | ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
|
67 | : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
|
68 | }
|
69 | if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
|
70 | var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
|
71 | othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
|
72 |
|
73 | if (objIsWrapped || othIsWrapped) {
|
74 | var objUnwrapped = objIsWrapped ? object.value() : object,
|
75 | othUnwrapped = othIsWrapped ? other.value() : other;
|
76 |
|
77 | stack || (stack = new Stack);
|
78 | return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
|
79 | }
|
80 | }
|
81 | if (!isSameTag) {
|
82 | return false;
|
83 | }
|
84 | stack || (stack = new Stack);
|
85 | return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
|
86 | }
|
87 |
|
88 | module.exports = baseIsEqualDeep;
|