考慮下面的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)
}
考慮下面的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)
}
交換機case語句就像一個goto。這意味着如果你與一個標籤相匹配,你就直接跳到它。之後你的代碼流不受影響。
這是一個很好的方式。一種「精心控制」的轉向。 –
IIRC最初跳轉到匹配的內存地址,然後簡單地執行其中的所有內容;這意味着匹配'case'後的每一行代碼。今天,這可能不再具有很大的相關性,但行爲仍然存在。 – deceze
沒有['break'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/break)...意味着沒有休息。 –
'switch'使用* fall-through *邏輯;它會從第一個匹配的案例開始執行所有的事情。這是多麼有用的問題值得商榷,但這就是永遠以多種語言設計的方式。 – deceze
考慮如果你想多個案例做相同的代碼塊... –