2014-10-10 93 views
3

我遇到了不同类型的for循环,我没有看到或使用common.I试图弄清楚,但在过程中得到更多的困惑。它doesn' t有它的第三个参数,或者甚至是一个检查方法来打破循环。它在一个数组上迭代并打印它的值。实际上,它遇到了某个索引的'undefined'值,但是当它遇到undefined时我没有告诉它断开。请帮我打破这里的谜题......这是什么for循环决定什么时候打破循环

(function() { 
 
    var a = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 
 
    for (var i = 0, value; value = a[i++];) { 
 
     document.write(value + '</br>'); 
 
    } 
 
})();

+0

'value = a [i ++]'我正在递增,循环的条件直到最后一个定义了'a [i]'的索引'i'。 – Cheery 2014-10-10 21:31:04

+0

'for'循环被执行,直到“条件部分”的值被评估为错误。 – Teemu 2014-10-10 21:34:58

+1

这是因为每次迭代都会检查条件'value = a [i ++]'。当检查它'i ++'增加'i'时。当'i'变得太大时,在数组外部,我将它定义为'undefined',其值为false。但千万不要这样做,这是非常糟糕的编程。 – 2014-10-10 21:39:16

回答

2

在JavaScript中,当y如果超出数组长度访问数组元素,则不会收到范围检查错误,返回的值为undefined,对应于false时,将其视为布尔值 - 因此达到数组末尾时的循环终止。

如果任何数组元素为undefined或其他值为false为布尔值,则循环将终止于该元素。

javascript中的赋值运算符返回左侧的值,因此使用表达式value = a[i++]返回a[i]的值,并按此顺序增加i。如果该值作为布尔值转换为false,则循环终止。

1

For循环重复,直到第一个;为真后的条件。最后在你的情况下,数组a[i++]中的最后一个元素将变成虚假(ToBoolean(undefined))。一旦发生循环停止。

看一看规范For Statement

  • 重复
           一个。如果第一表达式存在,则
                     我。让testExprRef是评估第一个Expression的结果。
                    ii。如果ToBoolean(GetValue(testExprRef))为false,则返回(正常,V,空)。
  • 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将递增,然后返回增加后的值)。

    他们还可以写过这样的:

    (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,这是一个falsy值,会导致循环终止。

    2

    几件事情需要注意:

    1. undefined是“falsy”(非真)值
    2. 时,其状态变为非真实
    3. 分配a[i]一个循环终止(或a[i++] ),以value回报value

    所以,当i == 9a[i++] == undefined,所以value == undefined,所以循环终止。

    1
    for (var i = 0, value; value = a[i++];) { 
    

    for的第二部分被评估为每次迭代的条件。

    此处发生自动类型转换,以便评估a[i++]的值。如果a[i++]为真,循环继续,否则停止。