在构造中使用for循环遍历集合

时间:2014-05-08 13:46:38

标签: javascript

首先,我在这里只是一个菜鸟。几个星期前我通过Wrox" Beginning JavaScript"开始我的JavaScript课程。到目前为止,非常好。

我很好奇为什么作者从未使用for in循环语句来访问集合中的不同对象。所有示例都使用for语句遍历集合。所以,我给出了一个遍历所有链接对象但使用for in构造的示例。这是我的代码:

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript">
            function linkCounter_onload()
            {
                var linkObj = document.links;
                for(var linkIndex in linkObj)
                {
                    alert(linkObj[linkIndex].href);
                }
            }
        </script>
    </head>
    <body onload="linkCounter_onload()">
        <ul>
            <li><a href="http://news.com">News</a></li>
            <li><a href="http://espn.com">ESPN</a></li>
            <li><a href="http://wikipedia.org">Wikipedia</a></li>
        </ul>
    </body>
</html>

但是,当我通过在Chrome中打开HTML页面来运行代码时,它首先显示三个警告框,每个警告框显示相应链接的href,然后,它显示另外三个警告框,其值为{{ 1}}。我在IE中测试了该页面,而Opera和包括Chrome在内的所有三个页面都以相同的方式运行,但不是Firefox,因为它没有显示undefined而且还有一个额外提醒弹出窗口。

如果我更改了函数以便它使用undefined循环,则代码可以正常工作。例如:

for

我的直觉是调试代码,看看发生了什么。我在Chrome中的function linkCounter_onload() { var linkObj = document.links; for(var linkIndex = 0; linkIndex < linkObj.length; linkIndex++) { alert(linkObj[linkIndex].href); } } 变量上放置了一个手表,以查看它获得的值。在调试时,我观察到linkIndex"0""1"值,"2"变量也会获得一些意外的值,例如linkIndex,{{1 }和"length"然后,循环结束。

之后,我去了Firefox并使用默认调试器来观察linkedIndex变量以及上面提到的值,还看到了额外的值"item"

此外,当我尝试将"namedItem"与其他集合一起使用时,我遇到了同样的问题。


我已经了解到JavaScript可以智能地处理像C ++这样的数组,我需要小心确保我不会越过界限(不谈论向量)。这对我来说很令人兴奋,因为事情比C ++简单得多。

那么,为什么会这样呢?是因为我对"@@iterator"构造的工作有误解吗?如果没有,如果它确实可以遍历任何数组,为什么在遍历集合时会出现问题?它有任何限制吗?

2 个答案:

答案 0 :(得分:1)

for...in最好用于枚举对象的属性

var foo = {a:1, b:2, c:3};
for(var varName in foo)
{
    console.log(varName + " : " + foo[varName]);
}

如果你在类似数组的结构上运行它:

var arr = [0, 1, 2, 3];
arr.foo = "bar";
for(var x in arr){
    console.log(x + " : " + typeof(x));
}

您会注意到它会枚举字符串,而不是数字,并提取您不会期望的内容。这真的是错误的工具,你应该改为:

for(var i = 0; i < arr.length; ++i){
    console.log(i + " : " + arr[i]);
}

答案 1 :(得分:0)

for .. in仅在可枚举属性上进行迭代 结构如下:

var o = {a:1, b:2, c:3};

如果您尝试alert (linkIndex);,您将获得

0
1
2
length
item
nameditem

如果你在循环开始前console.debug(linkObj);, 并在开发人员工具(Chrome)上打开控制台,您将获得

[a, a, a, item: function, namedItem: function]

所以?

数组linkObj不是100%可枚举的,并且它有一些其他属性,不一定是这个数组的键或索引。

这就是为什么前3个警报是正确的:0 1 2,但其他警报不是

价: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in