【问题标题】:Confusing outcome of simple for loop简单 for 循环的令人困惑的结果
【发布时间】:2020-04-13 19:47:37
【问题描述】:

我对这个简单的 for 循环的结果有些困惑

for (var i = 0; i < 10; i++) {
  console.log(i);
}

console.log 打印 i 的值从 0 到 9。

但是,当我检查 i 的值时,浏览器中的开发工具会给我 10。

有人可以向我解释为什么 i 的值在这里是 10 吗?我的循环 (i &lt; 10) 中的条件不允许它超过 9。

如果我在这里循环一个数组,我会得到它。我会有索引值和 array.length 总是高于最高索引号。

那么谁能解释一下这是怎么回事?

[更新]感谢您的即时回复和帮助! 我赞成每一个正确的答复。但是“绿色复选标记”是给最先给出全面答案的人。

【问题讨论】:

  • i 会被赋予什么值,所以 i
  • 每次迭代时 i 的值都会增加,然后检查条件。所以要最终确定循环 i 的值增加到 10,然后检查它是否大于 10,因此满足循环结束的条件。
  • i 的值变为 10,但由于它不满足条件 i &lt; 10 ,因此不在循环内进行控制台。您可以将var i = 0 更改为let i = 0

标签: javascript loops for-loop


【解决方案1】:

你自己已经回答了你的问题:

i &lt; 10 不再成立时,您的循环条件会中止循环。所以,反过来想,i 必须是10 或更高的循环才能中止!因此,您会看到 i 的末尾有 10

会发生这样的事情:

  • ...
  • i9
  • i &lt; 10 是真的
  • 您的循环体执行(最后一次)
  • i++ 执行,使 i 10
  • i &lt; 10 不再是真的
  • 您的循环已中止
  • 现在查看 i,您会看到 10,因为它在我的解释前面 3 步得到了该值

如果您想知道如何在循环外看到i:那是因为var 创建了函数范围的变量。 i 在整个函数中都可用,甚至在你的循环之前(那里是undefined)和之后。要创建块范围的变量,您可以改用let

如果你单步执行代码,你可以在调试器中非常清楚地看到整个过程(查看控制台输出、当前位置和右侧监视区域中的i 变量内容):

【讨论】:

  • NO if i 是 9 并且它是真的这意味着循环的执行应该停止在那里本身并且不会进一步增加。
  • 为什么?那没有意义。那么i &lt; 10 的条件如何not 为真? 9 &lt; 10... 所以它会继续,但在 10 它会停止,因为 10 &lt; 10 不正确。
  • 是,但它会检查条件,如果是,则会在 hte 日志中打印 10
  • 请在您的控制台中查看。
  • 是的,在这里你可以看到它像我说的那样工作:recordit.co/pnJuilGF9S
【解决方案2】:

这个

for (var i = 0; i < 10; i++) {
  console.log(i);
}

大致相当于

var i = 0;
while ( i < 10 )
{
  console.log(i);
  i++;
}

如您所见,首先检查循环条件,然后完成增量。在循环结束时,当i == 9 时,循环最后一次被评估,i 递增并且条件不再成立。

因此,当循环终止时,i10

【讨论】:

    【解决方案3】:

    您设置循环,使i 增加,直到条件为真。

    这是 for 循环的工作原理:

    1. 执行初始化程序 (i=0)
    2. 检查条件(是i &lt;10?)
    3. 如果为真,则循环执行代码 (console.log(i))
    4. 执行后循环操作,在本例中为i++
    5. 从第 2 点开始重复,直到条件不再成立

    i=9,最后一次条件为真时(2),执行循环中的代码(3),执行后循环动作,这样i=10(4),条件检查再次,循环终止,因为条件不再为真。

    但是现在i=10

    【讨论】:

      【解决方案4】:

      重要的是understand the purpose of each the 3 (optional) expressions in a for-loop

      1) 初始化表达式

      表达式(包括赋值表达式)或变量 声明在循环开始之前评估一次。通常用于 初始化一个计数器变量。这个表达式可以选择声明 带有 var 或 let 关键字的新变量。用 var 声明的变量 不是循环本地的,即它们与 for 在同一范围内 循环在。用 let 声明的变量是语句的局部变量。 该表达式的结果被丢弃。

      2) 条件表达式

      在每次循环迭代之前要评估的表达式。如果这 表达式计算为真,语句被执行。这个有条件的 测试是可选的。如果省略,则条件始终计算为真。 如果表达式的计算结果为 false,则执行跳到第一个 for 构造之后的表达式。

      3) 最终表达式

      在每次循环迭代结束时计算的表达式。这 发生在下一次条件评估之前。一般用于 更新或增加计数器变量。

      基于这些定义,很明显,当i == 9 条件表达式将计算为true 时,您的最终表达式将执行。看到最终表达式将i 增加1,9 然后变为10

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多