Skip to content

Commit 969c5fb

Browse files
committed
fix(reactivity): fix hasOwnProperty key coercion edge cases
1 parent e5919d4 commit 969c5fb

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

packages/reactivity/__tests__/reactive.spec.ts

+28
Original file line numberDiff line numberDiff line change
@@ -302,4 +302,32 @@ describe('reactivity/reactive', () => {
302302
const observed = reactive(original)
303303
expect(isReactive(observed)).toBe(false)
304304
})
305+
306+
test('hasOwnProperty edge case: Symbol values', () => {
307+
const key = Symbol()
308+
const obj = reactive({ [key]: 1 }) as { [key]?: 1 }
309+
let dummy
310+
effect(() => {
311+
dummy = obj.hasOwnProperty(key)
312+
})
313+
expect(dummy).toBe(true)
314+
315+
delete obj[key]
316+
expect(dummy).toBe(false)
317+
})
318+
319+
test('hasOwnProperty edge case: non-string values', () => {
320+
const key = {}
321+
const obj = reactive({ '[object Object]': 1 }) as { '[object Object]'?: 1 }
322+
let dummy
323+
effect(() => {
324+
// @ts-expect-error
325+
dummy = obj.hasOwnProperty(key)
326+
})
327+
expect(dummy).toBe(true)
328+
329+
// @ts-expect-error
330+
delete obj[key]
331+
expect(dummy).toBe(false)
332+
})
305333
})

packages/reactivity/src/baseHandlers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ function createArrayInstrumentations() {
8282

8383
function hasOwnProperty(this: object, key: unknown) {
8484
// #10455 hasOwnProperty may be called with non-string values
85-
key = '' + key
85+
if (!isSymbol(key)) key = String(key)
8686
const obj = toRaw(this)
8787
track(obj, TrackOpTypes.HAS, key)
8888
return obj.hasOwnProperty(key as string)

0 commit comments

Comments
 (0)