2016-09-28 33 views
1

我已經閱讀了很多關於SO的答案,但似乎無法找到一個明確的答案,爲什麼如果在這種情況下忽略break,情況「C」將總是被評估爲true,並且新的數組填充將只會「G」 的。我清楚地知道,休息會在這裏得到最好的使用,因爲我只是想要評估一個特定的比賽,但不是這樣,爲什麼如果確實省略了休息時,最後一種情況總是如此。爲什麼Break需要使用Switch?

var dna = "ATTGC"; 
var outArr = []; 
dna.split("").forEach(function(e,i){ 
    switch(e) { 
     case "G": outArr[i] = "C"; break; 
     case "T": outArr[i] = "A"; break; 
     case "A": outArr[i] = "T"; break; 
     case "C": outArr[i] = "G"; break; 
    } 
    console.log(outArr); 
    }) 
+1

的'開關... case'聲明是這樣設計,如果你忽略'break'語句中條件的評價「落空」下的各類案件。所以,當你忽略'break'時,你所看到的是每個情況都匹配到最後一個情況的條件。 – 2016-09-28 21:20:59

+0

並不是最後一種情況是正確的,而是每種情況都是一個入口點,在這個入口點之後,所有語句都會被執行,直到'switch'塊結束。 – shmosel

+0

補充jeyoung評論。 'break'有一個很好的理由,如果你想爲不同的情況做同樣的事情,你可以做到這一點,而break會阻止它發生。 –

回答

0

當案例匹配時,如果您沒有中斷,它將繼續處理下一個案例,而不管它是否與條件匹配。因此,他們將全部擊中最後一種情況,並且輸出將被「G」覆蓋。

1

switchif/else有些可以互換,除了準確地在開關中允許的內容。在和if/elseif/elseif/..../else鏈中,只有一個塊將永遠執行,例如,

x = 7; 
if (x == 5) { 
    ... no match, not executed at all 
} else if (x == 7) { 
    .... match made, this is executed 
} else if (x == 7) { 
    ... this will not execute, because the other block already did 
} else { 
    ... this also never executes, because a match was made earlier 
} 

相比之下,具有switch,一旦匹配,沒有進一步的對比試驗完成後,和下面的所有的代碼將被執行,直到開關塊關閉(}),或遇到break

x = 7; 
switch(x) { 
    case 5: ... nothing matched, not executed; break; 
    case 7: do_something(); 
    case 8: other_stuff(); 
    case 9: foo(); break; 
    case 7: ... will not execute, because matching stopped above. 
    default: stuff(); 
} 

注意在case 7線缺乏break的。這意味着執行繼續,並忽略所有進一步的case行。即執行do_something(),然後執行other_stuff(),執行foo()。最後遇到一個break,這會終止現在長期運行的case,然後繼續執行switch之後的任何內容。

2

從MDN

如果發現匹配,程序執行相關的語句。如果多個案例匹配提供的值,則匹配的第一個案例被選中,即使案例不相等。

與每個案例標籤關聯的可選break語句確保一旦匹配的語句被執行並且在switch語句後繼續執行,程序就會脫離switch。如果省略break,程序將繼續執行switch語句中的下一個語句。

所以基本的歷史大約開關是它源於C和爲branch table的抽象和分支表也有一個隱含的落空,而且需要額外跳轉指令,以避免它。 繼承的所有其他語言切換爲默認C開關語義大多選擇保持默認的C語義。 因此,在您的開關中,如果在所有情況下都省略break,如果找到匹配項,則繼續執行下一個語句。在找到匹配後,它不會退出交換機,而是將匹配的情況下的所有其他情況計算爲,因爲解析器認爲這些情況是合併的,因爲它們之間沒有中斷。 我已經修改了您的代碼,以便清楚地解釋此行爲。在案例中,A中斷被忽略。

var dna = "ATTGC"; 
var outArr = []; 
dna.split("").forEach(function(e,i){ 
switch(e) { 
    case "G": outArr[i] = "C"; break; 
    case "T": outArr[i] = "A"; break; 
    case "A": outArr[i] = "T"; 
    case "C": outArr[i] = "G"; break; 
} 
console.log(outArr); 
}) 

所以你的輸出就會像

["G"] 
["G", "A"] 
["G", "A", "A"] 
["G", "A", "A", "C"] 
["G", "A", "A", "C", "G"] 

在第一次迭代的比賽將是情況一個

outArr={'T'} 

同樣由於沒有突破聲明,它會考慮個案Ç爲同一區塊,並繼續執行那裏。現在

outArr={'G'} 

Similalrly在第二次迭代它的情況下匹配牛逼但有一個休息語句,以便控制跳出開關和outarr現在將

outArr={'G','A'} 

同樣,對於其他迭代你會得到上面發佈的整個輸出。

更新斌here

相關問題