0

我们正在开发一个基于 javascript 的 GIS 应用程序,一切都很顺利,直到有人决定启动 IE9 并在那里试一试。正如您可能已经猜到的那样,该应用程序崩溃了。

原来,由于某些莫名其妙的原因for..in循环无法迭代childNodes

var xmldoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
xmldoc.loadXML("<i18n><item>one</item><item>two</item></i18n>");

var currentItem = xmldoc.getElementsByTagName("i18n")[0].firstChild;

while (currentItem) {
    if (currentItem.nodeType == 1) {
        for (var i in currentItem.childNodes) {
            console.log(currentItem.childNodes[i]);
        }
    }
    currentItem = currentItem.nextSibling;
}

但是,当上面代码中的内部for循环被替换为

for (var j = 0; j < currentItem.childNodes.length; j++) {
    console.log(currentItem.childNodes[j]);
}

一切都按预期工作-它遍历子节点没有任何问题。

尽管我发现了一种解决方法,但这个问题仍然让我很恼火,因为尚不清楚它为什么会发生。XMLDocumentfor..in的 MSDN 文档均未提及任何内容。

这是一个错误还是另一个 IE 著名的记录不充分的奇怪案例?

4

2 回答 2

2

好吧,这不是一个错误,因为DOM 规范没有定义应该有数字属性,只是去糖的item方法[]

根本不使用for..in.

于 2013-08-19T13:48:58.147 回答
2

简短的回答:不要for..in用于迭代数组。数组应始终使用for()循环进行迭代。只有非数组对象应该使用for...in.

如果必须在此处使用 a for..in,则应使用过滤循环.hasOwnProperty()以防止对属于数组原型而不是数组本身的属性进行不必要的迭代。

这一点适用于所有 for..in循环:为确保您的代码是健壮的,您应该养成始终使用 过滤它们的习惯.hasOwnProperty(),即使是在普通对象上,但尤其是在数组上,因为我们已经知道它们包含额外的属性。

有关这一点的更多信息,请参见此处

于 2013-08-19T13:52:15.610 回答