mirror of https://github.com/vuejs/core.git
fix(reactivity): fix hasOwnProperty key coercion edge cases
This commit is contained in:
parent
e5919d4658
commit
969c5fb30f
|
@ -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)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue