2017-04-18 230 views
0

我遇到了一些誤會。有一個爲週期,如果某些語句:for循環和if語句

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

公告沒有大括號,但輸出是可以的。 你能解釋一下,有什麼區別?

+5

不是你的問題,但**總是使用大括號**。只要這樣做,你就可以防止許多愚蠢的錯誤。 – Carcigenicate

+0

並顯示第二個輸出的代碼。 – Carcigenicate

+0

@NinaScholz呃。你爲什麼... – evolutionxbox

回答

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建議在評論中,總是使用大括號!

1

正如很多評論指出的那樣,它的第一個代碼中沒有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加「嘶嘶」的倍數,如果它的倍數5添加「嗡嗡聲」...

1

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 < 100,和statementCnumber++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。這就是爲什麼最後一個例子沒有{}

重要的是要注意代碼可能工作,但它仍然是錯誤的代碼。建議使用{}for,whileif以下的語句分組,即使它是單個語句。

您可能想在嘗試理解JavaScript代碼之前學習JavaScript語法。 https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps