javascript var alert但使用时未定义

时间:2011-08-24 02:13:25

标签: 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]未定义。根本没有想法。

3 个答案:

答案 0 :(得分: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等于长度之前停止,直到{{1}为止}等于长度,因为i索引基本上被添加到循环的总长度,意味着3 + 1。此数组上的4个循环太多,因此0而不是<。你想在4之前停止,而不是在4之后但在5之前停止。

此外,通常优先考虑缓存<=的长度,因为某些浏览器不对其进行优化。

答案 1 :(得分:1)

由于您正在执行i <= videos.length,因此您正在读取videos数组末尾的内容。 Javascript数组是零索引的,因此您通常希望迭代长度为-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"
}

答案 2 :(得分:1)

将“&lt; =”更改为“&lt;”在for循环中。它应该解决问题。

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