Switch 語句的"替代品",對象映射讓條件判斷更簡潔!
為了根據(jù)不同的條件執(zhí)行不同的邏輯,傳統(tǒng)的做法是使用 switch 語句或者多個(gè) if-else 分支,但這些方法往往會(huì)讓代碼變得冗長且難以維護(hù)。
1. 傳統(tǒng) switch 語句的痛點(diǎn)
讓我們先看一個(gè)典型的 switch 語句示例:
function getStatusMessage(status) {
switch (status) {
case 'loading':
return '正在加載...';
case 'success':
return '操作成功!';
case 'error':
return '操作失敗,請重試';
case 'timeout':
return '請求超時(shí)';
default:
return '未知狀態(tài)';
}
}
這種寫法存在幾個(gè)問題:
- 代碼冗長:每個(gè) case 都需要寫 break 語句
- 易出錯(cuò):忘記寫 break 會(huì)導(dǎo)致貫穿執(zhí)行
- 可讀性差:大量的樣板代碼影響核心邏輯的閱讀
- 難以擴(kuò)展:添加新條件需要修改函數(shù)內(nèi)部
2. 對象映射:更簡潔的替代方案
(1) 基礎(chǔ)用法
使用對象映射,上面的代碼可以簡化為:
優(yōu)勢顯而易見:
- 代碼量減少了 60%
- 邏輯更清晰,一目了然
- 不會(huì)出現(xiàn)忘記 break 的問題
(2) 函數(shù)映射:處理復(fù)雜邏輯
當(dāng)需要執(zhí)行復(fù)雜邏輯時(shí),可以將值設(shè)為函數(shù):
對于需要非字符串鍵的場景,可以使用 Map 對象:
3. 高級應(yīng)用場景
多條件映射:
4. 性能對比
讓我們來看看性能差異:
// 測試數(shù)據(jù)
const testCases = Array.from({ length: 10000 }, () =>
['loading', 'success', 'error', 'timeout'][Math.floor(Math.random() * 4)]
);
// Switch 版本
function switchVersion(status) {
switch (status) {
case 'loading': return '正在加載...';
case 'success': return '操作成功!';
case 'error': return '操作失敗,請重試';
case 'timeout': return '請求超時(shí)';
default: return '未知狀態(tài)';
}
}
// 對象映射版本
const objectMapping = {
loading: '正在加載...',
success: '操作成功!',
error: '操作失敗,請重試',
timeout: '請求超時(shí)'
};
function objectVersion(status) {
return objectMapping[status] || '未知狀態(tài)';
}
// 性能測試
console.time('Switch版本');
testCases.forEach(switchVersion);
console.timeEnd('Switch版本');
console.time('對象映射版本');
testCases.forEach(objectVersion);
console.timeEnd('對象映射版本');
通常情況下,對象映射的性能會(huì)略優(yōu)于 switch 語句,特別是在分支較多的情況下。
當(dāng)然,這并不意味著要完全拋棄 switch 語句。在選擇使用哪種方案時(shí),應(yīng)該根據(jù)具體的業(yè)務(wù)場景和需求來決定。對于簡單的映射關(guān)系,對象映射是更好的選擇;對于復(fù)雜的條件判斷和控制流,switch 語句可能更加合適。