From: Evan You Date: Mon, 15 Apr 2024 09:18:39 +0000 (+0800) Subject: fix(reactivity): fix hasOwnProperty key coercion edge cases X-Git-Tag: v3.4.22~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=969c5fb30f4c725757c7385abfc74772514eae4b;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): fix hasOwnProperty key coercion edge cases --- diff --git a/packages/reactivity/__tests__/reactive.spec.ts b/packages/reactivity/__tests__/reactive.spec.ts index ab953ff891..cdcd032580 100644 --- a/packages/reactivity/__tests__/reactive.spec.ts +++ b/packages/reactivity/__tests__/reactive.spec.ts @@ -302,4 +302,32 @@ describe('reactivity/reactive', () => { const observed = reactive(original) expect(isReactive(observed)).toBe(false) }) + + test('hasOwnProperty edge case: Symbol values', () => { + const key = Symbol() + const obj = reactive({ [key]: 1 }) as { [key]?: 1 } + let dummy + effect(() => { + dummy = obj.hasOwnProperty(key) + }) + expect(dummy).toBe(true) + + delete obj[key] + expect(dummy).toBe(false) + }) + + test('hasOwnProperty edge case: non-string values', () => { + const key = {} + const obj = reactive({ '[object Object]': 1 }) as { '[object Object]'?: 1 } + let dummy + effect(() => { + // @ts-expect-error + dummy = obj.hasOwnProperty(key) + }) + expect(dummy).toBe(true) + + // @ts-expect-error + delete obj[key] + expect(dummy).toBe(false) + }) }) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 36707aa913..943f329571 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -82,7 +82,7 @@ function createArrayInstrumentations() { function hasOwnProperty(this: object, key: unknown) { // #10455 hasOwnProperty may be called with non-string values - key = '' + key + if (!isSymbol(key)) key = String(key) const obj = toRaw(this) track(obj, TrackOpTypes.HAS, key) return obj.hasOwnProperty(key as string)