2017-04-19 68 views
-3

考慮下面的JS代碼片段。即使case: 2不匹配,它也會打印1和2! 我知道,我可以把break;來防止這一點,但我想了解這背後的真正邏輯。當沒有匹配時執行一個塊是沒有意義的。爲什麼`switch`,`case`即使不匹配也會執行代碼塊?

var a = 1 
 
switch(a){ 
 
    case 1: 
 
\t \t console.log(1) 
 
    case 2: 
 
\t \t console.log(2) 
 
}

+4

沒有['break'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/break)...意味着沒有休息。 –

+4

'switch'使用* fall-through *邏輯;它會從第一個匹配的案例開始執行所有的事情。這是多麼有用的問題值得商榷,但這就是永遠以多種語言設計的方式。 – deceze

+3

考慮如果你想多個案例做相同的代碼塊... –

回答

4

交換機case語句就像一個goto。這意味着如果你與一個標籤相匹配,你就直接跳到它。之後你的代碼流不受影響。

+0

這是一個很好的方式。一種「精心控制」的轉向。 –

+0

IIRC最初跳轉到匹配的內存地址,然後簡單地執行其中的所有內容;這意味着匹配'case'後的每一行代碼。今天,這可能不再具有很大的相關性,但行爲仍然存在。 – deceze

相關問題