首先,我在这里只是一个菜鸟。几个星期前我通过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"
构造的工作有误解吗?如果没有,如果它确实可以遍历任何数组,为什么在遍历集合时会出现问题?它有任何限制吗?
答案 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