我遇到了一种我不常见或常用的不同类型的for循环。我试图找出它但在这个过程中更加困惑。它没有第三个参数或者甚至是一种打破循环的检查方法。它迭代一个数组并打印它的值。实际上它遇到了“未定义的”#39;某个索引的价值,但我不会告诉它什么时候会遇到undefined.please帮我打破这个难题......
(function () {
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for (var i = 0, value; value = a[i++];) {
document.write(value + '</br>');
}
})();
&#13;
答案 0 :(得分:2)
在javascript中,当您访问超出数组长度的数组元素时,您不会收到范围检查错误,返回的值为undefined
,当被视为布尔值时,它对应于false
- 因此,当到达数组的末尾时,循环终止。
如果任何数组元素为undefined
或任何其他值为false
的布尔值,则循环将终止于该元素。
javascript中的赋值运算符返回左侧的值,因此表达式value = a[i++]
用于返回a[i]
的值并按此顺序递增i
。如果此值以布尔值的形式转换为false
,则循环终止。
答案 1 :(得分:2)
for循环的所有参数都是可选的。
for循环中的第一个语句只是一个变量声明,因此您可以定义多个变量。作者可以改为写作:
var a=[1,2,3,4,5,6,7,8,9];
var value;
for(var i = 0; value = a[i++];)
但改为简洁。
第三个语句(递增/递减)是可选的,作者(再次出于绝对简洁)决定使用后缀增量(i++
将返回i然后递增它,而++i
将递增THEN返回递增的值)。
他们也可以写下这个:
(function () {
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var value;
var i = 0;
for ( ; value = a[i++]; ) {
document.write(value + '</br>');
}
})();
最后,作为最终条件的a[a.length+1]
将返回undefined
,这是一个假值并将导致循环终止。
答案 2 :(得分:2)
有几点需要注意:
undefined
是一个“虚假”(非真实)值a[i]
(或a[i++]
)分配给value
,返回value
因此,当i == 9
,a[i++] == undefined
,value == undefined
时,循环终止。
答案 3 :(得分:1)
对于循环重复,直到第一个;
之后的条件为真。在你的情况下,最终在数组a[i++]
中的最后一个元素将变为假(ToBoolean(undefined)
)之后。一旦发生循环停止。
查看For Statement的规范:
- 重复
醇>
一个。如果第一个表达式存在,那么
一世。让testExprRef成为评估第一个表达式的结果 II。如果ToBoolean(GetValue(testExprRef))为 false ,则返回(normal,V,empty)。
答案 4 :(得分:1)
for (var i = 0, value; value = a[i++];) {
for的第二部分被评估为每次迭代的条件。
此处发生自动类型转换,以便评估a[i++]
的值。如果a[i++]
为真,则循环继续,否则停止。