]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): fix hasOwnProperty key coercion edge cases
authorEvan You <yyx990803@gmail.com>
Mon, 15 Apr 2024 09:18:39 +0000 (17:18 +0800)
committerEvan You <yyx990803@gmail.com>
Mon, 15 Apr 2024 09:18:53 +0000 (17:18 +0800)
packages/reactivity/__tests__/reactive.spec.ts
packages/reactivity/src/baseHandlers.ts

index ab953ff891abc41ae23d2f55dcba1e237e9d2886..cdcd032580563daaa93a3e6daccd749b2f659285 100644 (file)
@@ -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)
+  })
 })
index 36707aa913844c827fe9831b42f7cf02545225c8..943f329571c1c21a52f79a1ec4c4fe4f261b6f09 100644 (file)
@@ -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)