(val1, val2, mode, memos)
| 280 | } |
| 281 | |
| 282 | function objectComparisonStart(val1, val2, mode, memos) { |
| 283 | if (mode === kStrict) { |
| 284 | if (wellKnownConstructors.has(val1.constructor) || |
| 285 | (val1.constructor !== undefined && !hasOwn(val1, 'constructor'))) { |
| 286 | if (val1.constructor !== val2.constructor) { |
| 287 | return false; |
| 288 | } |
| 289 | } else if (ObjectGetPrototypeOf(val1) !== ObjectGetPrototypeOf(val2)) { |
| 290 | return false; |
| 291 | } |
| 292 | } |
| 293 | |
| 294 | if (ArrayIsArray(val1)) { |
| 295 | if (!ArrayIsArray(val2) || |
| 296 | (val1.length !== val2.length && (mode !== kPartial || val1.length < val2.length)) || |
| 297 | hasUnequalTag(val1, val2)) { |
| 298 | return false; |
| 299 | } |
| 300 | |
| 301 | const filter = mode !== kLoose ? ONLY_ENUMERABLE : ONLY_ENUMERABLE | SKIP_SYMBOLS; |
| 302 | const keys2 = getOwnNonIndexProperties(val2, filter); |
| 303 | if (mode !== kPartial && |
| 304 | keys2.length !== getOwnNonIndexProperties(val1, filter).length) { |
| 305 | return false; |
| 306 | } |
| 307 | return keyCheck(val1, val2, mode, memos, kIsArray, keys2); |
| 308 | } |
| 309 | |
| 310 | let val1Tag; |
| 311 | if (val1[SymbolToStringTag] === undefined && |
| 312 | (val1Tag = ObjectPrototypeToString(val1)) === '[object Object]') { |
| 313 | if (slowHasUnequalTag(val1Tag, val1, val2)) { |
| 314 | return false; |
| 315 | } |
| 316 | return keyCheck(val1, val2, mode, memos, kNoIterator); |
| 317 | } else if (isSet(val1)) { |
| 318 | if (!isSet(val2) || |
| 319 | (val1.size !== val2.size && (mode !== kPartial || val1.size < val2.size)) || |
| 320 | hasUnequalTag(val1, val2)) { |
| 321 | return false; |
| 322 | } |
| 323 | return keyCheck(val1, val2, mode, memos, kIsSet); |
| 324 | } else if (isMap(val1)) { |
| 325 | if (!isMap(val2) || |
| 326 | (val1.size !== val2.size && (mode !== kPartial || val1.size < val2.size)) || |
| 327 | hasUnequalTag(val1, val2)) { |
| 328 | return false; |
| 329 | } |
| 330 | return keyCheck(val1, val2, mode, memos, kIsMap); |
| 331 | } else if (isArrayBufferView(val1)) { |
| 332 | if (TypedArrayPrototypeGetSymbolToStringTag(val1) !== |
| 333 | TypedArrayPrototypeGetSymbolToStringTag(val2)) { |
| 334 | return false; |
| 335 | } |
| 336 | if (mode === kPartial && val1.byteLength !== val2.byteLength) { |
| 337 | if (!isPartialArrayBufferView(val1, val2)) { |
| 338 | return false; |
| 339 | } |
no test coverage detected
searching dependent graphs…