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

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