1
为了学习的目的,我在javascript中遍历对象。现在,相当于吐出第一个对象中的每个属性,该函数被赋予并递归到它找到的任何子对象(包括函数)中。递归到没有无限循环的对象中
以窗口对象为例,当window.top指向窗口时,函数陷入无限循环。我应该如何最好地追踪我已经遍历的对象,以避免递归到它们中?
为了学习的目的,我在javascript中遍历对象。现在,相当于吐出第一个对象中的每个属性,该函数被赋予并递归到它找到的任何子对象(包括函数)中。递归到没有无限循环的对象中
以窗口对象为例,当window.top指向窗口时,函数陷入无限循环。我应该如何最好地追踪我已经遍历的对象,以避免递归到它们中?
您可以使用数组来存储您当前正在查看的对象。这应该有助于检测循环引用:
var stack = [];
function traverse(object) {
if (stack.indexOf(object) !== -1) {
return; // if the condition above is true, we have a circular reference
}
stack.push(object);
// here go through object properties, recursively calling traverse()
stack.pop();
}
我会试试这个,看看我们是否错过了一些东西。这是我的想法之一,但我认为我驳回了它,因为我看不到如何比较对象。将接受这个如果它的工作! – 2013-02-27 12:10:56
在JS中,您可以将属性添加到任何对象,甚至是本地对象。所以你可以说'currentObj.didProcess = true'。 'currentObj'可能是'window','HTMLElement'或者函数。 – marekful 2013-02-26 11:57:15
我喜欢这个想法。 – 2013-02-26 11:58:02
尽管存在冲突的可能性很小,因为其他代码可能正在创建具有相同名称的属性。您还必须确保在代码执行后您创建的属性被删除,其中包括处理可能的错误。我会考虑修改这样的对象,因为它可能会影响其他代码。 – 2013-02-26 17:59:58