UNPKG

940 BJavaScriptView Raw
1/* @flow */
2
3import { _Set as Set, isObject } from '../util/index'
4import type { SimpleSet } from '../util/index'
5import VNode from '../vdom/vnode'
6
7const seenObjects = new Set()
8
9/**
10 * Recursively traverse an object to evoke all converted
11 * getters, so that every nested property inside the object
12 * is collected as a "deep" dependency.
13 */
14export function traverse (val: any) {
15 _traverse(val, seenObjects)
16 seenObjects.clear()
17}
18
19function _traverse (val: any, seen: SimpleSet) {
20 let i, keys
21 const isA = Array.isArray(val)
22 if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
23 return
24 }
25 if (val.__ob__) {
26 const depId = val.__ob__.dep.id
27 if (seen.has(depId)) {
28 return
29 }
30 seen.add(depId)
31 }
32 if (isA) {
33 i = val.length
34 while (i--) _traverse(val[i], seen)
35 } else {
36 keys = Object.keys(val)
37 i = keys.length
38 while (i--) _traverse(val[keys[i]], seen)
39 }
40}