今天偶然看到 switch(true) 的寫法蝴光,第一感覺是有點奇怪,細(xì)細(xì)一想诗宣,發(fā)覺這個寫法很妙友题,先上代碼:
var num = 25;
switch (true) {
case num < 0:
alert("Less than 0.");
break;
case num >= 0 && num <= 10:
alert("Between 0 and 10.");
break;}
case num >= 10 && num <= 20:
alert("Between 10 and 20.");
break;
default:
alert("More than 20.");
}
一般我們的寫法都是如下所示。我們根據(jù) expression 的值等于哪個值是做相應(yīng)的操作滑绒,然后跳出 switch 語句。(此時 expression 的值都是確定的幾個值)。switch 語句中的每一種情形(case)的含義是:“如果表達(dá)式(expression)等于這個值(value)晤揣,則執(zhí)行后面的語句(statement)”。這里的表達(dá)式我們會習(xí)慣性的認(rèn)為是一個確定的值朱灿,而遇到不確定值或者一個取值范圍時好像不適用了(其實不是的)昧识。
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
此種情況下如果使用 if-else 語句,代碼結(jié)構(gòu)如下盗扒。代碼結(jié)構(gòu)與可讀性比 switch 差些跪楞,如果判斷條件更多時,switch 就更有優(yōu)勢了侣灶。從根本上說甸祭,switch 語句就是為了讓開發(fā)人員免于編寫像下面這樣的代碼。
if (expression === 'case1') {
// do sth...
} else if (expression === 'case1') {
// do sth...
} else if (expression === 'case1') {
// do sth...
} else {
// do sth...
}
// 最常見的是有區(qū)間范圍的情況
if (num === 0) {
// do sth...
} else if (num < 10) {
// do sth...
} else if (num < 100) {
// do sth...
} else {
// do sth...
}
所以初學(xué)者(我也是)會這樣認(rèn)為:
- 當(dāng) expression 是一個確定的值褥影,且 expression 的值存在較多可能時池户,選擇 switch;
- 當(dāng)需要對 expression 的值判斷多個范圍(而不是具體值)時凡怎,選用 if-else 語句校焦。
回到我們開頭的那段代碼,這個例子之所以給 switch 語句傳遞表達(dá)式 true统倒,是因為每個 case 值都可以返回一個布爾值寨典。這樣,每個 case 按照順序被求值房匆,直到找到匹配的值或者遇到 default 語句為止耸成。
這樣我們不難發(fā)現(xiàn)上面的結(jié)論都是錯的,switch 語句也可使用范圍判定的語句坛缕,這樣就可以代替冗長的 if-else 語句了墓猎。