JavaScript中判斷的優雅寫法示例
前言
我們在寫 JavaScript 時經常遇到一些邏輯判斷,可以使用 if/else 或者 switch 來實現,但是對於復雜的判斷,過多的條件往往會讓我們的代碼變得冗長,可讀性下降。故我們需要優化我們的代碼,使之更優雅💎。
一、一元判斷
1.1 舉個例子🌰
我們寫一個常見的 if/else 判斷的函數,然後對他進行優化。
const myFunction = (status) => { if (status === 1) { console.log("status1"); } else if (status === 2) { console.log("status2"); } else if (status === 3) { console.log("status3"); } };
1.2 放入 Object 中
我們知道, JavaScript 的 Object 其實就是一些 鍵值對 的無序集合,正因如此我們可以借助其存放判斷的條件。例如上述情況,判斷條件是一個數字類型,後續操作也僅僅是用到瞭一個字符串,這時我們就可以創建一個對象,把所用到的數字和字符串分別作為 Object 的鍵名和對應值。
// 將判斷條件放入 Object 中 const statusObj = { 1: "status1", 2: "status2", 3: "status3", }; // 優化後函數💎 const myFunction = (status) => { console.log(statusObj[status]); };
1.3 放入 Map 中
除瞭原始對象以外,我們還可以使用 Map 對象。我們來看下 MDN 對其的描述:
Map 對象保存鍵值對,並且能夠記住鍵的原始插入順序。任何值(對象或者原始值) 都可以作為一個鍵或一個值。
不難看出,Map 對象其實就是普通對象的加強版,特別是任何值都可以作為其鍵值對,這意味著 函數 、 正則 等也可以作為其鍵或值,這也就大大方便瞭我們將其作為判斷的操作。具體關於 Map 對象的細節此處不再展開。
// 將判斷條件放入 Map 中 const statusMap = new Map([ [1, "status1"], [2, "status2"], [3, "status3"], ]); // 優化後函數💎 const myFunction = (status) => { console.log(statusMap.get(status)); };
二、多元判斷
2.1 舉個例子🌰
既然一元判斷可以優化,那麼多元判斷也可以進行優化,下面是有兩種判斷條件的案例。
// 舉個例子🌰 const myFunction = (right, status) => { if (right === "administrator" && status === 1) { console.log("管理員喜歡王冰冰"); } else if (right === "administrator" && status === 2) { console.log("管理員不喜歡王冰冰"); } else if (right === "user" && status === 1) { console.log("用戶喜歡王冰冰"); } else if (right === "user" && status === 2) { console.log("用戶不喜歡王冰冰"); } }; // 有重復情況的例子🌰 const myFunction = (right, status) => { if (right === "administrator" && status === 1) { console.log("管理員喜歡王冰冰"); } else if (right === "administrator" && status === 2) { console.log("管理員喜歡王冰冰"); } else if (right === "user" && status === 1) { console.log("用戶喜歡王冰冰"); } else if (right === "user" && status === 2) { console.log("用戶喜歡王冰冰"); } };
2.2 將判斷條件拼成字符串放入 Object 中
兩種情況也同樣可以用 Object 進行優化。
// 優化"例子🌰" // 將判斷條件放入 Object 中 const actionsObj = { "administrator-1": "管理員喜歡王冰冰", "administrator-2": "管理員不喜歡王冰冰", "user-1": "用戶喜歡王冰冰", "user-2": "用戶不喜歡王冰冰", }; // 優化後函數💎 const myFunction = (right, status) => { console.log(actionsObj[`${right}-${status}`]); }; // 可以將函數作為"value",以下幾種情況類似,不再贅述🥕 const actionsObj = { "administrator-1": () => console.log("管理員喜歡王冰冰"), "administrator-2": () => console.log("管理員喜歡王冰冰"), "user-1": () => console.log("管理員喜歡王冰冰"), "user-2": () => console.log("管理員喜歡王冰冰"), }; // 優化後函數💎 const myFunction = (right, status) => { actionsObj[`${right}-${status}`](); }; // 優化"有重復情況的例子🌰" // 可以提取公共函數,以下幾種情況類似,不再贅述🍓 const actions = () => { const f1 = () => console.log("管理員喜歡王冰冰"); const f2 = () => console.log("用戶喜歡王冰冰"); return { "administrator-1": f1, "administrator-2": f1, "user-1": f2, "user-2": f2, }; }; // 優化後函數💎 const myFunction = (right, status) => { actions()[`${right}-${status}`](); };
2.3 將判斷條件拼成字符串放入 Map 中
同樣的,我們也可以用 Map 對象。我們把兩個條件存成字符串。
// 優化"例子🌰" // 將判斷條件放入 Map 中 const actionsMap = new Map([ ['administrator-1', '管理員喜歡王冰冰'], ['administrator-2', '管理員不喜歡王冰冰'], ['user-1', '用戶喜歡王冰冰'], ['user-2', '用戶不喜歡王冰冰'] ]); // 優化後函數💎 const myFunction = (right, status) => { console.log(actionsMap.get(`${right}-${status}`)); };
2.4 將判斷條件放入 Object 後再放入 Map 中
// 優化"例子🌰" // 將判斷條件放入 Map 中 const actionsMap = new Map([ [{ right: 'administrator', status: 1 }, () => console.log('管理員喜歡王冰冰')], [{ right: 'administrator', status: 2 }, () => console.log('管理員不喜歡王冰冰')], [{ right: 'user', status: 1 }, () => console.log('用戶喜歡王冰冰')], [{ right: 'user', status: 2 }, () => console.log('用戶不喜歡王冰冰')] ]); // 優化後函數💎 const myFunction = (right, status) => { const action = [...actionsMap].filter(([e]) => (e.right === right && e.status === status)); action.forEach(([_, index]) => index.call()); };
2.5 將判斷條件寫成 正則 後再放入 Map 中
利用正則表達式可以處理相對復雜一點的情況。
// 優化"有重復情況的例子🌰" // 將判斷條件寫成 正則 後再放入 Map 中 const actions = () => { const f1 = () => console.log('管理員喜歡王冰冰'); const f2 = () => console.log('用戶喜歡王冰冰'); return new Map([ [/^administrator-[1-2]/, f1], [/^user-[1-2]/, f2] ]); }; // 優化後函數💎 const myFunction = (right, status) => { const action = [...actions()].filter(([e]) => e.test(`${right}-${status}`)); action.forEach(([_, index]) => index.call()); };
結語
我們利用原生 Object 和 Map 對象對判斷進行瞭優化,不過在真正的開發過程中,我們還是要遵循 實用優先 的原則,避免過度優化。
到此這篇關於JavaScript中判斷的優雅寫法的文章就介紹到這瞭,更多相關JavaScript判斷優雅寫法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- WordPress一鍵切換為其他用戶身份登錄功能方法
- Javascript Object對象類型使用詳解
- JavaScript中forEach的錯誤用法匯總
- javascript ES6中set集合、map集合使用方法詳解與源碼實例
- 此管理單元不能用於這一版本的windows10系統提示怎麼解決