From: Pick Date: Wed, 26 Aug 2020 15:41:18 +0000 (+0800) Subject: perf(reactivity): avoid triggering Map.has twice on non-reactive keys (#1972) X-Git-Tag: v3.0.0-rc.9~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=97bc30edadb52e57e29b3c6e36c04ec71916103c;p=thirdparty%2Fvuejs%2Fcore.git perf(reactivity): avoid triggering Map.has twice on non-reactive keys (#1972) --- diff --git a/packages/reactivity/__tests__/collections/Map.spec.ts b/packages/reactivity/__tests__/collections/Map.spec.ts index 6ee2c81ee4..5219a9ea39 100644 --- a/packages/reactivity/__tests__/collections/Map.spec.ts +++ b/packages/reactivity/__tests__/collections/Map.spec.ts @@ -436,5 +436,16 @@ describe('reactivity/collections', () => { map.set('b', 1) expect(spy).toHaveBeenCalledTimes(3) }) + + it('should trigger has only once for non-reactive keys', () => { + const map = new Map() + const spy = jest.fn() + map.has = spy + + let proxy = reactive(map) + proxy.has('k') + + expect(spy).toBeCalledTimes(1) + }) }) }) diff --git a/packages/reactivity/src/collectionHandlers.ts b/packages/reactivity/src/collectionHandlers.ts index 4f4b972614..24ae151561 100644 --- a/packages/reactivity/src/collectionHandlers.ts +++ b/packages/reactivity/src/collectionHandlers.ts @@ -59,7 +59,9 @@ function has(this: CollectionTypes, key: unknown, isReadonly = false): boolean { !isReadonly && track(rawTarget, TrackOpTypes.HAS, key) } !isReadonly && track(rawTarget, TrackOpTypes.HAS, rawKey) - return target.has(key) || target.has(rawKey) + return key === rawKey + ? target.has(key) + : target.has(key) || target.has(rawKey) } function size(target: IterableCollections, isReadonly = false) {