【问题标题】:for cycle and if statementsfor 循环和 if 语句
【发布时间】:2017-04-18 14:13:45
【问题描述】:

我遇到了一些误解。有一个带有一些 if 语句的 for 循环:

for (var number = 1; number < 100; number++) {
  if (number % 3 == 0 && number % 5 == 0)
    console.log(number + "fizzbuzz");
  if (number % 5 == 0)
    console.log(number + " buzz");
  if (number % 3 == 0)
    console.log(number + " fizz");
  else console.log(number);
}

这段代码的输出是 1, 2, 3 fizz, 4, 5 buzz 等。所以这是预期的结果。 但是如果我们删除大括号,输出将是这样的:

15fizzbuzz
30fizzbuzz
45fizzbuzz
60fizzbuzz
75fizzbuzz
90fizzbuzz
100 buzz
100

此外,该程序还有第二个实现(使用正确的 if-else 语句):

for (var number = 1; number < 100; number++)
  if (number % 3 == 0 && number % 5 == 0)
    console.log(number + "fizzbuzz");
  else if (number % 5 == 0)
    console.log(number + "buzz");
  else if (number % 3 == 0)
    console.log(number + "fizz");
  else console.log(number);

注意也没有大括号,但是输出没问题。 你能解释一下,有什么区别吗?

【问题讨论】:

  • 不是您的问题,但始终使用大括号。这样做可以防止许多愚蠢的错误。
  • 并显示第二个输出的代码。
  • 第二种情况,只执行if/else语句之一。
  • 大括号在这种情况下没有任何区别。这是第一个中缺少else 子句。
  • 您的第一个示例没有将else 用于前两个if 语句,因此将测试所有3 个if 条件(并且每个条件都可能产生输出)。你的第二个是,所以只有一个分支会被输入。而且,您说第二个实现是以“正确的方式”完成的(使用else 分支),但实际上并不是因为没有大括号。这是合法的,但非常糟糕的做法。

标签: javascript for-loop if-statement


【解决方案1】:

当您错过分号或括号时,javascript 会尝试自行插入它,& 有时会产生类似这样的奇怪结果。 (根据规则这是正确的,只是人类和机器不同意如何处理它:D)

当您删除 for 循环的大括号时,javascript 会尝试将大括号放入代码中并运行它,这与您期望它的行为方式不同,因此您会感到困惑!

你写的和读的:

for (var number = 1; number < 100; number++)
  if (number % 3 == 0 && number % 5 == 0)
    console.log(number + "fizzbuzz");
  if (number % 5 == 0)
    console.log(number + " buzz");
  if (number % 3 == 0)
    console.log(number + " fizz");
  else console.log(number);

javascript 用它做了什么并执行:

for (var number = 1; number < 100; number++){ //runs loop here
  if (number % 3 == 0 && number % 5 == 0){
    console.log(number + "fizzbuzz"); //prints for first condition
  }
}

//now number is 100!

if (number % 5 == 0){
  console.log(number + " buzz"); //prints for second condition once cause 100%5==0 is true
}

if (number % 3 == 0){
  console.log(number + " fizz"); 
}
else{
  console.log(number); //prints for this else condition once cause 100%3==0 is false
}

这是完全有效的,这里没有错误或错误!

发生这种情况是因为如果在if 之后不是立即的else,那么 javascript 会在那里终止该语句,但如果您使用else...if,那么它会继续该语句,直到找到else 或后面没有的语句else

如果您想尝试这种类型的行为,请使用Google Closure Compiler 来查看机器如何解释代码。

注意:正如@carcigenicate 在 cmets 中建议的那样,始终使用大括号!

【讨论】:

    【解决方案2】:

    正如许多 cmets 所指出的,是您的第一个代码中缺少 else(或 blocks)导致它出错。

    //a bit shortified to make it clearer
    var a=true,b=true;
    if(a && b){ }// will be executed
    if(a){ } //will be executed
    if(b){} //will be executed
    
    //vs.
    if(a&&b){}//will be executed
    else if(a){}//else => not executed
    else if(b){}//else => not executed
    

    但是,最好将代码重组为重复性很强的代码:

    for (var number = 1; number < 100; number++)
        console.log(number+ (number % 3 == 0?"fizz":"")+ (number % 5 == 0?"buzz":""));
    

    所以记录这个数字,如果它是 3 的倍数添加“fizz”,如果它是 5 的倍数添加“buzz”...

    【讨论】:

      【解决方案3】:

      for 循环的语法是for (statementA; statementB; statementC) statementD。语句可以与{} 组合在一起,因此{statement, statement, ...} 可以用于需要单个语句的地方。

      for (var number = 1; number < 100; number++) {
        if (number % 3 == 0 && number % 5 == 0)
          console.log(number + "fizzbuzz");
        if (number % 5 == 0)
          console.log(number + " buzz");
      

      在这种情况下,statementAvar number = 1statementBnumber &lt; 100statementCnumber++statementDif (number % 3 == 0 &amp;&amp; number % 5 == 0) console.log(number + "fizzbuzz")。第二个if 是另一个不属于for 循环的语句。如果要让第二个if 语句属于for 循环,则需要使用{} 将语句组合在一起。

      if 语句的语法是if (expression) statementif (expression) else statement。使用多个 if else 对齐,您可以将第一条语句传递给 for 循环,第二条语句将属于仍然属于 for 循环的第一个 if。这就是为什么最后一个示例在没有{} 的情况下也可以工作的原因。

      重要的是要注意代码可能有效,但它仍然是糟糕的代码。建议使用{} 将下面的语句分组为forwhileif,即使是单个语句。

      在尝试理解 JavaScript 代码之前,您可能需要学习 JavaScript 语法。 https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps

      【讨论】:

        猜你喜欢
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多