diff --git a/packages/reactivity/__tests__/reactive.spec.ts b/packages/reactivity/__tests__/reactive.spec.ts index ab953ff891a..cdcd0325805 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 36707aa9138..943f329571c 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)