(a, b, mode, keys1, keys2, memos, iterationType)
| 980 | } |
| 981 | |
| 982 | function objEquiv(a, b, mode, keys1, keys2, memos, iterationType) { |
| 983 | // The pair must have equivalent values for every corresponding key. |
| 984 | if (keys2.length > 0) { |
| 985 | let i = 0; |
| 986 | // Ordered keys |
| 987 | if (keys1 !== undefined) { |
| 988 | for (; i < keys2.length; i++) { |
| 989 | const key = keys2[i]; |
| 990 | if (keys1[i] !== key) { |
| 991 | break; |
| 992 | } |
| 993 | if (!innerDeepEqual(a[key], b[key], mode, memos)) { |
| 994 | return false; |
| 995 | } |
| 996 | } |
| 997 | } |
| 998 | // Unordered keys |
| 999 | for (; i < keys2.length; i++) { |
| 1000 | const key = keys2[i]; |
| 1001 | // It is faster to get the whole descriptor and to check it's enumerable |
| 1002 | // property in V8 13.0 compared to calling Object.propertyIsEnumerable() |
| 1003 | // and accessing the property regularly. |
| 1004 | const descriptor = ObjectGetOwnPropertyDescriptor(a, key); |
| 1005 | if (descriptor === undefined || descriptor.enumerable !== true) { |
| 1006 | return false; |
| 1007 | } |
| 1008 | const value = descriptor.writable !== undefined ? descriptor.value : a[key]; |
| 1009 | if (!innerDeepEqual(value, b[key], mode, memos)) { |
| 1010 | return false; |
| 1011 | } |
| 1012 | } |
| 1013 | } |
| 1014 | |
| 1015 | if (iterationType === kIsArray) { |
| 1016 | if (mode === kPartial) { |
| 1017 | return partialArrayEquiv(a, b, mode, memos); |
| 1018 | } |
| 1019 | for (let i = 0; i < a.length; i++) { |
| 1020 | if (b[i] === undefined) { |
| 1021 | if (!hasOwn(b, i)) |
| 1022 | return sparseArrayEquiv(a, b, mode, memos, i); |
| 1023 | if ((a[i] !== undefined || !hasOwn(a, i)) && (mode !== kLoose || a[i] !== null)) |
| 1024 | return false; |
| 1025 | } else if ((a[i] === undefined || !innerDeepEqual(a[i], b[i], mode, memos)) && |
| 1026 | (mode !== kLoose || b[i] !== null)) { |
| 1027 | return false; |
| 1028 | } |
| 1029 | } |
| 1030 | } else if (iterationType === kIsSet) { |
| 1031 | if (!setEquiv(a, b, mode, memos)) { |
| 1032 | return false; |
| 1033 | } |
| 1034 | } else if (iterationType === kIsMap) { |
| 1035 | if (!mapEquiv(a, b, mode, memos)) { |
| 1036 | return false; |
| 1037 | } |
| 1038 | } |
| 1039 |
no test coverage detected
searching dependent graphs…