首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环语句和if语句

循环语句和if语句
EN

Stack Overflow用户
提问于 2017-04-18 14:13:45
回答 3查看 905关注 0票数 0

我遇到了一些误解。有些if语句有一个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);
}

这段代码的输出是1,2,3模糊,4,5嗡嗡声等等,所以这是预期的结果。但是,如果删除大括号,输出将如下所示:

代码语言:javascript
复制
15fizzbuzz
30fizzbuzz
45fizzbuzz
60fizzbuzz
75fizzbuzz
90fizzbuzz
100 buzz
100

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

代码语言:javascript
复制
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);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-18 14:39:01

当您遗漏分号或括号时,javascript尝试自己插入它&有时会产生一些奇怪的结果,比如这样的结果。(这是正确的规则,只有人和机器不同意如何处理它:D )

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

你所写和读的:

代码语言: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对它所做的&执行:

代码语言: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
}

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

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

如果您想玩这种类型的行为,请使用Google闭包编译器查看代码是如何被机器解释的。

注:在评论中建议使用@Carcigen式,总是使用括号!

票数 1
EN

Stack Overflow用户

发布于 2017-04-18 14:27:18

正如许多评论所指出的那样,第一段代码中缺少elses (或块)是导致它出错的原因。

代码语言:javascript
复制
//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

但是,最好将代码重构为相当重复的代码:

代码语言:javascript
复制
for (var number = 1; number < 100; number++)
    console.log(number+ (number % 3 == 0?"fizz":"")+ (number % 5 == 0?"buzz":""));

因此,记录这个数字,如果它是3的倍数,加上"fizz“,如果是5的倍数,则添加”buzz“.

票数 1
EN

Stack Overflow用户

发布于 2017-04-18 14:33:17

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

代码语言: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");

在本例中,statementAvar number = 1statementBnumber < 100statementCnumber++statementDif (number % 3 == 0 && 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语法。步骤

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43474652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档