【问题标题】:How strict is the syntax of a for-loopfor 循环的语法有多严格
【发布时间】:2015-10-13 22:36:24
【问题描述】:

所以我在编码方面有相当丰富的经验。我曾涉足 Basic、HTML、Javascript、C 和 C++,尽管我最近使用的是 HTML 和 Javascript。

我非常熟悉 for 循环。我已经多次使用它来遍历数组、操作递归函数等。我知道它的作用以及如何使用它,但我的问题是 它是如何工作的

前提

在大多数语言中,for 循环的基本语法如下:

var upperLimit = 10;

for(var i = 0; i < upperLimit; i++) {
    /*Code to be executed*/
    console.log(i);
}

在 Javascript 中,这将在控制台中输出从 0 到 9 的数字。

我知道括号包含 3 个部分,每个部分用分号分隔。

  • 首先是初始化,它通常设置用于循环语句的变量。
  • 第二个是条件,它在大括号之间的任何代码执行之前运行。如果结果为True,则执行代码。否则,for 循环将停止。
  • 第三个是增量,它包含要在循环中执行的最后一位代码,并且通过扩展,是在下一次条件检查之前执行的最后一件事。

问题

那么,我的问题是这些定义有多严格?

初始化的定义不允许太多。它只是说该行执行一次,它在循环中的任何其他内容之前执行,并且它的范围仅限于循环。除了迭代变量之外,我想不出你还想放在那个位置上。

但是另外两个呢?我见过条件只是一个变量的代码,只要它是正数(因为正数被视为布尔值只是转换为true),循环就会继续。

然后是增量,这似乎是这些部分中最松散的。它真的只是在代码中执行的最后一件事,还是明确需要迭代初始化中声明的变量?对于我熟悉的语言来说,似乎是前者。

例如,我决定做一个非标准的for循环,我想出了这个例程:

var numbers = [0,1,2,3,4,5,6,7,8,9];
        
for(var i = 0;
    numbers.length;
    console.log(numbers.pop())) {}

它完全按照我的预期运行:它在控制台中按降序输出 numbers 数组的每个成员,然后留下一个空 numbers 数组,它使用基本上是一个空的 for 循环来完成。

结束

那么我的假设是否正确?如果是这样,除了我在这个问题顶部写的格式(可能更接近第二种格式)之外,还有其他格式使用 for 循环的实际应用吗?

【问题讨论】:

  • 第三部分不是增量,它是在每个循环结束时运行的指令,所以基本上你可以在这里放任何你想要的,只要它是一个指令(就像你在你的样品)。顺便说一句,这也适用于许多其他语言。如果你想了解它是如何工作的,我建议你学习一些编译基础知识。
  • 你仍然遵循定义;要使用的变量、条件、指令
  • 你的假设看起来大部分是正确的,但是有一个很好的理由不做你的非标准循环之类的事情:你在做什么或者为什么不明显。顺便说一句,您可以在第一部分放置多个变量 (for(var a=0, b={}, c=[1,2]; ...)
  • 它的范围仅限于循环 -- 错误(在 JavaScript 中)。
  • 为什么不直接阅读the manual

标签: javascript loops


【解决方案1】:

首先,你给一个数组

var numbers = [0,1,2,3,4,5,6,7,8,9];

下面的代码是一个正确的for循环。

for(var i = 0;
    numbers.length;
    console.log(numbers.pop())) {}

为此定义的Javascript

for ([initialization]; [condition]; [final-expression])
   statement

对你来说,代码初始化是'var i = 0',并在循环开始时执行一次。

条件为'numbers.length',值为10。当数字不为0时,Javascript会将其转换为boolean true。所以条件为真。

最终表达式是“console.log(numbers.pop())”。执行 'numbers.pop()' 时,numbers.length 变为 9。但它仍然是。

第二次,条件将再次返回真。最终表达式也被执行。

直到 numbers.length 变为 0,Javascript 将其转换为 boolean false。循环将结束。

【讨论】:

    【解决方案2】:
    • 初始化变量的范围不限于循环,它对整个函数有效(在该行之前未定义)。您可以使用逗号初始化多个变量。 for (var i=0, j=1; i &lt; 10; i++)
    • 第二部分,任何计算为真值的东西都会导致循环继续进行:
      • Truthy: 1, -1, true, "something", {a: 2}
      • Falsey:0、假、空、未定义
      • 您可以忽略这一点并依赖代码中的中断
    • 第三部分只是让您更新循环变量,您可以省略它并在 for 循环体中执行。

    Here's an answer 提供了一种非标准循环的好方法,并带有警告,请参阅链接。

    var list = [{a:1,b:2}, {a:3,b:5}, {a:8,b:2}, {a:4,b:1}, {a:0,b:8}];
    
    for (var i=0, item; item = list[i]; i++) {
      // Look no need to do list[i] in the body of the loop
      console.log("Looping: index ", i, "item" + item);
    }
    

    【讨论】:

      【解决方案3】:

      在大多数语言中,for 循环的基本语法如下:

      for(initialization; condition; iteration) {
          /*Code to be executed*/
      }
      

      这三个都是常用的表达方式,你可以在这里使用任何有效的表达方式:

      for(
        var i=arr.length, othercond=true; 
        i; 
        othercond?i--:i++, console.log(i),updateothercond()
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-20
        • 2016-04-18
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        相关资源
        最近更新 更多