2011-08-24 59 views
1

使用时,这很奇怪。看看这个:JavaScript的变种警报,但未定义

for(var i = 0; i <= videos.length; i ++){ 

    alert(videos[i].id); // this works and alerts the correct number 

    var foo = videos[i].id; // firebug says "videos[i] is undefined" 

} 

有3视频。在FF中,这会警告所有3个视频ID然后失败,说未定义视频[i]。根本没有想法。

回答

5

得到您的for循环条件摆脱=的。

for(var i = 0; i < videos.length; i ++){ 
    ... 
} 

随着<=,你迭代的指数,比Array的实际指标值一个较大的,所以你遍历返回undefined索引无效。

例如...

如果你有array('A','B','C'),长度为3。现在,如果迭代到3 <= i,并且包括0,那么随着数组以Javascript开头,您将实际循环4次而不是3次。

A索引值是0,不1,所以你需要停止前i等于长度,不继续下去,直到i等于长度,因为0指数基本上是添加到总长度循环,意思是3 + 1。在这个阵列上的4个循环将会是太多,因此<而不是<=。您希望在4之前停止,而不是在4之后但在5之前停止。

此外,缓存Array的长度通常是一种好的做法,因为某些浏览器不会优化它。

+0

该工作。现在解释原因! – Fresheyeball

+0

因为你数组的索引以'0'开始,并且在循环测试中包含'=',那么你就要去一个元素太远了,它只需要小于长度,不等于。到 –

+0

@Fresheyeball OK,应进行编辑 – alex

1

既然你是做i <= videos.length,你正在阅读一个过去的videos数组的结尾。 JavaScript数组是零索引,所以你通常要重复最多length - 1

相反,尝试:在

for(var i = 0; i < videos.length; i ++){ 
    alert(videos[i].id); // this works and alerts the correct number 
    var foo = videos[i].id; // firebug says "videos[i] is undefined" 
} 
1

更改“< =”到“<”的循环。它应该解决问题。

的问题是,你必须在数组中只有三个项目。首先用0来解决第一项。这意味着2是最后一个有效索引。当代码尝试访问索引3时,它失败。 (该故障点将在第4次通过循环时,当警报(...)尝试访问不存在的第4个元素(位置3)时