简体   繁体   English

for循环和if语句

[英]for cycle and if statements

I've encountered some misundertanding. 我遇到了一些误会。 There is a for cycle with some if statements: 有一些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);
}

The output of this code is 1, 2, 3 fizz, 4, 5 buzz, etc. So it's what expected. 此代码的输出是1、2、3嘶嘶声,4、5嗡嗡声等。这就是预期的结果。 But if we delete braces the output will be like this: 但是,如果我们删除花括号,输出将如下所示:

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

Also, there is a second implementation of this program(with the right-way if-else statements): 另外,该程序还有第二种实现方式(带有正确的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);

Notice that there are no braces too, but the output is ok. 注意,也没有括号,但是输出正常。 Can you explain, what's the difference? 您能解释一下,有什么区别吗?

As a lot of comments pointed out, its the lack of elses ( or blocks ) in your first code that make it going wrong. 正如许多评论所指出的那样,在您的第一个代码中缺少其他代码(或代码块)会导致它出错。

//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

However, it might be better to restructure your code as its quite repetitive: 但是,最好将代码重组为相当重复的代码:

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

So log the number, if its a multiple of 3 add "fizz" and if its an multiple of 5 add "buzz"... 因此,请记录该数字,如果其3的倍数加上“嘶嘶声”,如果其5的倍数加上“嗡嗡声” ...

The syntax of a for loop is for (statementA; statementB; statementC) statementD . for循环的语法是for (statementA; statementB; statementC) statementD Statements can be grouped together with {} , so {statement, statement, ...} can be used where a single statement is expected. 语句可以与{}组合在一起,因此{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");

In this case statementA is var number = 1 , statementB is number < 100 , and statementC is number++ and statementD is if (number % 3 == 0 && number % 5 == 0) console.log(number + "fizzbuzz") . 在这种情况下, statementAvar number = 1statementBnumber < 100 ,而statementCnumber++statementDif (number % 3 == 0 && number % 5 == 0) console.log(number + "fizzbuzz") The second if is another statement that does not belong to the for loop. 第二个if是另一个不属于for循环的语句。 If you want for the second if statement to belong to the for loop, you need to use {} to group the statements together. 如果要让第二条if语句属于for循环,则需要使用{}将这些语句分组在一起。

The syntax of a if statement is if (expression) statement or if (expression) else statement . if语句的语法是if (expression) statementif (expression) else statement Using several if else aligned you are able to pass the first statement to the for loop, the second statement is going to belong to the first if that still belongs to the for loop. 使用多个if else对准你能第一个语句传递到for循环,第二个语句将属于第一if仍然属于for循环。 That is why the last example works without {} . 这就是为什么最后一个示例不使用{}

It is important to note that the code may work, but it is still bad code. 重要的是要注意代码可能有效,但它仍然是错误的代码。 It is recommended to use {} to group the statement from below for for , while , and if even if it is a single statement. 建议使用{}分组语句从下面的forwhile ,和if即使它是一个单独的语句。

You may want to learn the JavaScript syntax before trying to understand JavaScript code. 在尝试理解JavaScript代码之前,您可能需要学习JavaScript语法。 https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps

When you miss a semicolon or brackets, javascript tries to insert it on its own, & at times can produce some weird results like this. 当您错过分号或方括号时,javascript会尝试自行插入分号或&有时会产生类似这样的奇怪结果。 (Which is correct by the rules, just humans & machine don't agree on how to process it :D ) (这是正确的规则,只是人与机器不同意如何处理它:D)

When you remove braces of for loop javascript tries to puts braces in code & run it, this is different that how you expect it to behave thus you are confused! 当您删除for循环的大括号时for javascript尝试将大括号放入代码中并运行它,这与您期望它的行为不同,因此感到困惑!

What you wrote & read: 你写和读的东西:

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);

What javascript did with it & executes: 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
}

Which is perfectly valid & there is no error or bug here! 这是完全有效的,这里没有错误或错误!

This happens because if the is no immediate else after if then javascript terminate that statement there, but if you use else...if then it continues that statement till if find a else or a statement not followed by else 发生这种情况的原因是, ifif之后没有立即else ,则javascript会在那里终止该语句,但是如果您使用else...if则它将继续该语句,直到找到else或未跟随else语句为止

If you want to play with this type of behaviour use Google Closure Compiler to see how code is interpreted by machine. 如果您想使用这种行为,请使用Google Closure编译器查看计算机如何解释代码。

NOTE: As @carcigenicate suggest in comments, Always use braces! 注意:正如@carcigenicate在评论中建议的那样,请始终使用大括号!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM