我遇到了一些误解。有些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模糊,4,5嗡嗡声等等,所以这是预期的结果。但是,如果删除大括号,输出将如下所示:
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);注意,也没有大括号,但是输出是可以的。你能解释一下,有什么区别吗?
发布于 2017-04-18 14:39:01
当您遗漏分号或括号时,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
}这是完全有效的&这里没有错误或错误!
之所以会发生这种情况,是因为如果在else之后不是即时if,那么javascript就会在那里终止该语句,但是如果您使用else...if,则它会继续该语句,直到找到一个else或没有else后面的语句为止。
如果您想玩这种类型的行为,请使用Google闭包编译器查看代码是如何被机器解释的。
注:在评论中建议使用@Carcigen式,总是使用括号!
发布于 2017-04-18 14:27:18
正如许多评论所指出的那样,第一段代码中缺少elses (或块)是导致它出错的原因。
//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“.
发布于 2017-04-18 14:33:17
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");在本例中,statementA是var number = 1,statementB是number < 100,statementC是number++,statementD是if (number % 3 == 0 && number % 5 == 0) console.log(number + "fizzbuzz")。第二个if是另一个不属于for循环的语句。如果希望第二个if语句属于for循环,则需要使用{}将这些语句组合在一起。
if语句的语法是if (expression) statement或if (expression) else statement。使用几个对齐的if else,您可以将第一个语句传递给for循环,第二个语句将属于仍然属于for循环的第一个if。这就是为什么最后一个示例不需要{}就能工作的原因。
重要的是要注意,代码可能工作,但它仍然是糟糕的代码。建议使用{}从下面对for、while和if语句进行分组,即使它是一条语句。
在尝试理解JavaScript代码之前,您可能需要学习JavaScript语法。步骤
https://stackoverflow.com/questions/43474652
复制相似问题