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)
|
const observed = reactive(original)
|
||||||
expect(isReactive(observed)).toBe(false)
|
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) {
|
function hasOwnProperty(this: object, key: unknown) {
|
||||||
// #10455 hasOwnProperty may be called with non-string values
|
// #10455 hasOwnProperty may be called with non-string values
|
||||||
key = '' + key
|
if (!isSymbol(key)) key = String(key)
|
||||||
const obj = toRaw(this)
|
const obj = toRaw(this)
|
||||||
track(obj, TrackOpTypes.HAS, key)
|
track(obj, TrackOpTypes.HAS, key)
|
||||||
return obj.hasOwnProperty(key as string)
|
return obj.hasOwnProperty(key as string)
|
||||||
|
|
Loading…
Reference in New Issue