5個技巧讓你更好的編寫 JavaScript(ES6) 中條件語句

1、使用 Array.includes 來處理多個條件
// conditionfunction test(fruit) {if (fruit == 'apple' || fruit == 'strawberry') {console.log('red');}}
||?操作符來擴展該語句呢?Array.includes?重寫上面的條件語句。function test(fruit) {// 條件提取到數(shù)組中const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];if (redFruits.includes(fruit)) {console.log('red');}}
2、減少嵌套,提前使用 return 語句
如果沒有提供水果,拋出錯誤
接受水果?
quantity(數(shù)量)參數(shù),如果超過 10,則并打印相關(guān)信息。
function test(fruit, quantity) {const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];// 條件 1:fruit 必須有值if (fruit) {// 條件 2:必須為紅色if (redFruits.includes(fruit)) {console.log('red');// 條件 3:數(shù)量必須大于 10if (quantity > 10) {console.log('big quantity');}}} else {throw new Error('No fruit!');}}// 測試結(jié)果test(null); // 拋出錯誤:No fruitstest('apple'); // 打印:redtest('apple', 20); // 打印:red,big quantity
– 1 個 if / else 語句過濾掉無效條件
– 3 層 if 語句嵌套(分別是條件1,2和3)
/* 在發(fā)現(xiàn)無效條件時提前 return */function test(fruit, quantity) {const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];// 條件 1:提前拋出錯誤if (!fruit) throw new Error('No fruit!');// 條件2:必須為紅色if (redFruits.includes(fruit)) {console.log('red');// 條件 3:數(shù)量必須大于 10if (quantity > 10) {console.log('big quantity');}}}
if?語句很長時(想象一下,你需要滾動到最底部才知道那里有一個?else?語句,這樣代碼的可讀性就變得很差了)。/* 在發(fā)現(xiàn)無效條件時提前 return */function test(fruit, quantity) {const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];if (!fruit) throw new Error('No fruit!'); // 條件 1:提前拋出錯誤if (!redFruits.includes(fruit)) return; // 條件 2:當(dāng) fruit 不是紅色的時候,提前 returnconsole.log('red');// 條件 3:必須是大量存在if (quantity > 10) {console.log('big quantity');}}
代碼簡短直接,嵌套 if 更清晰
反轉(zhuǎn)條件可能會引發(fā)更多的思考過程(增加認知負擔(dān))
Avoid Else, Return Early?by Tim Oxley
StackOverflow 上關(guān)于 if/else 代碼風(fēng)格的討論
3、使用函數(shù)的默認參數(shù) 和 解構(gòu)
null?/?undefined?值并分配默認值:function test(fruit, quantity) {if (!fruit) return;const q = quantity || 1; // 如果沒有提供 quantity 參數(shù),則默認為 1console.log(`We have ${q} ${fruit}!`);}// 測試結(jié)果test('banana'); // We have 1 banana!test('apple', 2); // We have 2 apple!
q?。function test(fruit, quantity = 1) { // i如果沒有提供 quantity 參數(shù),則默認為 1if (!fruit) return;console.log(`We have ${quantity} ${fruit}!`);}// 測試結(jié)果test('banana'); // We have 1 banana!test('apple', 2); // We have 2 apple!
fruit?分配一個默認值:function test(fruit = 'unknown', quantity = 1)。function test(fruit) {// 如果有值,則打印 fruit.nameif (fruit && fruit.name) {console.log (fruit.name);} else {console.log('unknown');}}//測試結(jié)果test(undefined); // unknowntest({ }); // unknowntest({ name: 'apple', color: 'red' }); // apple
fruit.name?可用則打印水果名稱,否則將打印 unknown 。我們可以使用默認函數(shù)參數(shù)和解構(gòu)(destructing) 來避免?fruit && fruit.name?這樣的檢查。// 解構(gòu) —— 只獲得 name 屬性// 參數(shù)默認分配空對象 {}function test({name} = {}) {console.log (name || 'unknown');}//測試結(jié)果test(undefined); // unknowntest({ }); // unknowntest({ name: 'apple', color: 'red' }); // apple
{}?指定為默認值。如果我們不這樣做,你將在執(zhí)行行測試時遇到test(undefined)?–?Cannot destructure property name of 'undefined' or 'null'.(無法解析’undefined’或’null’的屬性名稱)。因為 undefined中 沒有?name?屬性。使用?Lodash get?函數(shù)
使用 Facebook 開源的?idx?庫(需搭配 Babeljs)
// 引入 lodash 庫,我們將獲得 _.get()function test(fruit) {console.log(_.get(fruit, 'name', 'unknown'); // 獲取 name 屬性,如果沒有分配,則設(shè)為默認值 unknown}//測試結(jié)果test(undefined); // unknowntest({ }); // unknowntest({ name: 'apple', color: 'red' }); // apple
get?或?getOr)。4、選擇 Map / Object 字面量,而不是Switch語句
function test(color) {// 使用 switch case 語句,根據(jù)顏色找出對應(yīng)的水果switch (color) {case 'red':return ['apple', 'strawberry'];case 'yellow':return ['banana', 'pineapple'];case 'purple':return ['grape', 'plum'];default:return [];}}//測試結(jié)果test(null); // []test('yellow'); // ['banana', 'pineapple']
// 使用對象字面量,根據(jù)顏色找出對應(yīng)的水果const fruitColor = {red: ['apple', 'strawberry'],yellow: ['banana', 'pineapple'],purple: ['grape', 'plum']};function test(color) {return fruitColor[color] || [];}
// 使用 Map ,根據(jù)顏色找出對應(yīng)的水果const fruitColor = new Map().set('red', ['apple', 'strawberry']).set('yellow', ['banana', 'pineapple']).set('purple', ['grape', 'plum']);function test(color) {return fruitColor.get(color) || [];}
重構(gòu)語法
Array.filter?來重構(gòu)我們的代碼,以實現(xiàn)相同的結(jié)果。// 使用 Map ,根據(jù)顏色找出對應(yīng)的水果const fruitColor = new Map().set('red', ['apple', 'strawberry']).set('yellow', ['banana', 'pineapple']).set('purple', ['grape', 'plum']);function test(color) {return fruitColor.get(color) || [];}
5、使用 Array.every 和 Array.some 來處理全部/部分滿足條件
const fruits = [{ name: 'apple', color: 'red' },{ name: 'banana', color: 'yellow' },{ name: 'grape', color: 'purple' }];function test() {let isAllRed = true;// 條件:所有的水果都必須是紅色for (let f of fruits) {if (!isAllRed) break;isAllRed = (f.color == 'red');}console.log(isAllRed); // false}
Array.every?減少行數(shù):const fruits = [{ name: 'apple', color: 'red' },{ name: 'banana', color: 'yellow' },{ name: 'grape', color: 'purple' }];function test() {// 條件:簡短方式,所有的水果都必須是紅色const isAllRed = fruits.every(f => f.color == 'red');console.log(isAllRed); // false}
Array.some?僅用一行代碼就實現(xiàn)出來。const fruits = [{ name: 'apple', color: 'red' },{ name: 'banana', color: 'yellow' },{ name: 'grape', color: 'purple' }];function test() {// 條件:簡短方式,所有的水果都必須是紅色const isAllRed = fruits.every(f => f.color == 'red');console.log(isAllRed); // false}

評論
圖片
表情
