Преглед изворни кода

do not trigger change on NaN->NaN set (fix #4236)

Evan You пре 9 година
родитељ
комит
c1bf20acb6
2 измењених фајлова са 9 додато и 4 уклоњено
  1. 1 1
      src/core/observer/index.js
  2. 8 3
      test/unit/modules/observer/observer.spec.js

+ 1 - 1
src/core/observer/index.js

@@ -162,7 +162,7 @@ export function defineReactive (
     },
     set: function reactiveSetter (newVal) {
       const value = getter ? getter.call(obj) : val
-      if (newVal === value) {
+      if (newVal === value || (newVal !== newVal && value !== value)) {
         return
       }
       if (process.env.NODE_ENV !== 'production' && customSetter) {

+ 8 - 3
test/unit/modules/observer/observer.spec.js

@@ -177,7 +177,7 @@ describe('Observer', () => {
   })
 
   it('observing object prop change', () => {
-    const obj = { a: { b: 2 }}
+    const obj = { a: { b: 2 }, c: NaN }
     observe(obj)
     // mock a watcher!
     const watcher = {
@@ -192,20 +192,25 @@ describe('Observer', () => {
     Dep.target = watcher
     obj.a.b
     Dep.target = null
-    expect(watcher.deps.length).toBe(3) // obj.a + a.b + b
+    expect(watcher.deps.length).toBe(3) // obj.a + a + a.b
     obj.a.b = 3
     expect(watcher.update.calls.count()).toBe(1)
     // swap object
     obj.a = { b: 4 }
     expect(watcher.update.calls.count()).toBe(2)
     watcher.deps = []
+
     Dep.target = watcher
     obj.a.b
+    obj.c
     Dep.target = null
-    expect(watcher.deps.length).toBe(3)
+    expect(watcher.deps.length).toBe(4)
     // set on the swapped object
     obj.a.b = 5
     expect(watcher.update.calls.count()).toBe(3)
+    // should not trigger on NaN -> NaN set
+    obj.c = NaN
+    expect(watcher.update.calls.count()).toBe(3)
   })
 
   it('observing object prop change on defined property', () => {