]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): fix tracking when hasOwnProperty is called with non-string value
authorEvan You <yyx990803@gmail.com>
Sun, 14 Apr 2024 14:46:48 +0000 (22:46 +0800)
committerEvan You <yyx990803@gmail.com>
Sun, 14 Apr 2024 14:46:48 +0000 (22:46 +0800)
close #10455
close #10464

packages/reactivity/__tests__/reactiveArray.spec.ts
packages/reactivity/src/baseHandlers.ts

index 1c6fcefd592112bf4e55b73c54f99eecf3622105..d405608f8c442d750f128de301ca4da07658a33d 100644 (file)
@@ -99,6 +99,21 @@ describe('reactivity/reactive/Array', () => {
     expect(fn).toHaveBeenCalledTimes(1)
   })
 
+  test("should reactive when mutate array's index", () => {
+    const original = [1, 2, 3]
+    const observed = reactive(original)
+
+    let dummy
+    effect(() => {
+      dummy = observed.hasOwnProperty(0)
+    })
+
+    expect(dummy).toBe(true)
+
+    delete observed[0]
+    expect(dummy).toBe(false)
+  })
+
   test('shift on Array should trigger dependency once', () => {
     const arr = reactive([1, 2, 3])
     const fn = vi.fn()
index 7cee7aa9bd5a618f1c060a85c2704f1973cf7913..36707aa913844c827fe9831b42f7cf02545225c8 100644 (file)
@@ -80,10 +80,12 @@ function createArrayInstrumentations() {
   return instrumentations
 }
 
-function hasOwnProperty(this: object, key: string) {
+function hasOwnProperty(this: object, key: unknown) {
+  // #10455 hasOwnProperty may be called with non-string values
+  key = '' + key
   const obj = toRaw(this)
   track(obj, TrackOpTypes.HAS, key)
-  return obj.hasOwnProperty(key)
+  return obj.hasOwnProperty(key as string)
 }
 
 class BaseReactiveHandler implements ProxyHandler<Target> {