【问题标题】:how this for loop determines when to break the loop这个 for 循环如何确定何时中断循环
【发布时间】:2014-10-10 21:27:04
【问题描述】:

我遇到了一种不同类型的 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>');
    }
})();

【问题讨论】:

  • value=a[i++] i 正在递增,循环条件直到定义了a[i] 的最后一个索引i
  • for 循环执行,直到“条件部分”的值评估为假。
  • 这是因为每次迭代都会检查条件value = a[i++]。并且在检查时i++ 递增i。当i 变得太大时,在数组之外,我将其设为undefined,其评估结果为假。但是永远不要做这样的循环,这是非常糟糕的编程。
  • @SpencerWieczorek 实际上,当目标是在第一个 undefined 值处停止时,这可能是一种遍历松散数组的有效方法。
  • @user3138436 出于学习目的,这很好。它只是专注于您在遍历数组时不需要使用.length。 JavaScript 只用于查找未定义的索引是可以的。但在任何其他语言中,这会给你一个index out-of-bounds 错误。

标签: javascript arrays for-loop


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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 THEN 递增它,而++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,这是一个虚假值,将导致循环终止。

    【讨论】:

      【解决方案3】:

      有几点需要注意:

      1. undefined 是一个“假”(非真)值
      2. 循环在其条件变为非真时终止
      3. a[i](或a[i++])分配给value会返回value

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

      【讨论】:

        【解决方案4】:
        for (var i = 0, value; value = a[i++];) {
        

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

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

        【讨论】:

          【解决方案5】:

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

          查看For Statement 的规范:

          1. 重复
            一个。如果第一个表达式存在,则
            一世。让 testExprRef 成为计算第一个表达式的结果。
            ii.如果 ToBoolean(GetValue(testExprRef)) 为 false,则返回(正常、V、空)。

          【讨论】:

            猜你喜欢
            • 2022-11-19
            • 1970-01-01
            • 2016-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多