Răsfoiți Sursa

use Set in deep traverse

Evan You 10 ani în urmă
părinte
comite
e59b3017fe
1 a modificat fișierele cu 10 adăugiri și 6 ștergeri
  1. 10 6
      src/watcher.js

+ 10 - 6
src/watcher.js

@@ -334,25 +334,29 @@ Watcher.prototype.teardown = function () {
  * @param {*} val
  */
 
-function traverse (val, walkedObjs) {
+const seenObjects = new Set()
+function traverse (val, seen) {
   var i, keys
 
-  walkedObjs = walkedObjs || {}
+  if (!seen) {
+    seen = seenObjects
+    seen.clear()
+  }
   if (isArray(val)) {
     i = val.length
-    while (i--) traverse(val[i], walkedObjs)
+    while (i--) traverse(val[i], seen)
   } else if (isObject(val)) {
     if (val.__ob__) {
       var depId = val.__ob__.dep.id
-      if (walkedObjs[depId]) {
+      if (seen.has(depId)) {
         return
       } else {
-        walkedObjs[depId] = true
+        seen.add(depId)
       }
     }
 
     keys = Object.keys(val)
     i = keys.length
-    while (i--) traverse(val[keys[i]], walkedObjs)
+    while (i--) traverse(val[keys[i]], seen)
   }
 }