<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 7300字,需瀏覽 15分鐘

           ·

          2020-09-05 10:29


          英文 |?https://scotch.io/bar-talk/5-tips-to-write-better-conditionals-in-javascript

          譯文 |?https://www.html.cn/archives/9865

          使用 JavaScript 時(shí),我們經(jīng)常需要處理很多條件語(yǔ)句,這里分享5個(gè)小技巧,可以讓你編寫更好/更清晰的條件語(yǔ)句。

          1、使用 Array.includes 來(lái)處理多個(gè)條件

          我們來(lái)看看下面的例子:
          JavaScript 代碼:
          // conditionfunction test(fruit) { if (fruit == 'apple' || fruit == 'strawberry') { console.log('red'); }}

          乍一看,上面的例子看起來(lái)似乎沒什么問(wèn)題。但是,如果我們還有更多的紅色水果呢?比如櫻桃(cherry)和蔓越莓(cranberries)。我們是否要用更多的?||?操作符來(lái)擴(kuò)展該語(yǔ)句呢?
          我們可以使用?Array.includes?重寫上面的條件語(yǔ)句。
          JavaScript 代碼:
          function test(fruit) { // 條件提取到數(shù)組中 const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
          if (redFruits.includes(fruit)) { console.log('red'); }}

          我們將紅色水果(條件)提取到一個(gè)數(shù)組中。這樣做,可以讓代碼看起來(lái)更整潔。

          2、減少嵌套,提前使用 return 語(yǔ)句

          讓我們擴(kuò)展前面的示例,再包含另外兩個(gè)條件:
          • 如果沒有提供水果,拋出錯(cuò)誤

          • 接受水果?quantity(數(shù)量)參數(shù),如果超過(guò) 10,則并打印相關(guān)信息。

          JavaScript 代碼:
          function test(fruit, quantity) { const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
          // 條件 1:fruit 必須有值 if (fruit) { // 條件 2:必須為紅色 if (redFruits.includes(fruit)) { console.log('red');
          // 條件 3:數(shù)量必須大于 10 if (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)
          我個(gè)人遵循的一般規(guī)則是?在發(fā)現(xiàn)無(wú)效條件時(shí)提前 return
          JavaScript 代碼:
          /* 在發(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ù)量必須大于 10 if (quantity > 10) { console.log('big quantity'); } }}

          這樣做,我們可以減少一個(gè)嵌套層級(jí)。這種編碼風(fēng)格很好,特別是當(dāng)你的?if?語(yǔ)句很長(zhǎng)時(shí)(想象一下,你需要滾動(dòng)到最底部才知道那里有一個(gè)?else?語(yǔ)句,這樣代碼的可讀性就變得很差了)。
          如果通過(guò)反轉(zhuǎn)條件并提前 return ,我們可以進(jìn)一步減少嵌套。請(qǐng)查看下面的條件 2 ,看看我們是如何做到的:
          JavaScript 代碼:
          /* 在發(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í)候,提前 return
          console.log('red');
          // 條件 3:必須是大量存在 if (quantity > 10) { console.log('big quantity'); }}

          通過(guò)反轉(zhuǎn)條件2的條件,我們的代碼現(xiàn)在沒有嵌套語(yǔ)句了。當(dāng)我們有很長(zhǎng)的邏輯代碼時(shí),這種技巧非常有用,我們希望在條件不滿足時(shí)停止下一步的處理。
          然而,這并不是嚴(yán)格的規(guī)定。問(wèn)問(wèn)自己,這個(gè)版本(沒有嵌套)是否要比前一個(gè)版本(條件 2 有嵌套)的更好、可具可讀性?
          對(duì)我來(lái)說(shuō),我會(huì)選擇前一個(gè)版本(條件 2 有嵌套)。這是因?yàn)椋?/span>
          • 代碼簡(jiǎn)短直接,嵌套 if 更清晰

          • 反轉(zhuǎn)條件可能會(huì)引發(fā)更多的思考過(guò)程(增加認(rèn)知負(fù)擔(dān))

          因此,始終追求更少的嵌套,提前 return,但是不要過(guò)度。但不要過(guò)度。如果您感興趣,這里有一篇文章和 StackOverflow 的討論, 進(jìn)一步討論這個(gè)話題:
          • Avoid Else, Return Early?by Tim Oxley

          • StackOverflow 上關(guān)于 if/else 代碼風(fēng)格的討論

          3、使用函數(shù)的默認(rèn)參數(shù) 和 解構(gòu)

          我想下面的代碼可能看起來(lái)很熟悉,我們?cè)谑褂?JavaScript 時(shí)總是需要檢查?null?/?undefined?值并分配默認(rèn)值:
          JavaScript 代碼:
          function test(fruit, quantity) { if (!fruit) return; const q = quantity || 1; // 如果沒有提供 quantity 參數(shù),則默認(rèn)為 1
          console.log(`We have ${q} ${fruit}!`);}
          // 測(cè)試結(jié)果test('banana'); // We have 1 banana!test('apple', 2); // We have 2 apple!

          實(shí)際上,我們可以通過(guò)分配默認(rèn)函數(shù)參數(shù)來(lái)消除變量?q?。
          JavaScript 代碼:
          function test(fruit, quantity = 1) { // i如果沒有提供 quantity 參數(shù),則默認(rèn)為 1 if (!fruit) return; console.log(`We have ${quantity} ${fruit}!`);}
          // 測(cè)試結(jié)果test('banana'); // We have 1 banana!test('apple', 2); // We have 2 apple!

          更簡(jiǎn)單直觀不是嗎?請(qǐng)注意,每個(gè)函數(shù)參數(shù)都有自己的默認(rèn)值。例如,我們也可以為?fruit?分配一個(gè)默認(rèn)值:function test(fruit = 'unknown', quantity = 1)
          注:如果你還不了解 ES6 中函數(shù)默認(rèn)參數(shù)的新特性,可以查看 JavaScript 函數(shù)中默認(rèn)參數(shù)?了解更多詳情。
          如果我們的 fruit 是一個(gè) Object 對(duì)象怎么辦?我們可以指定默認(rèn)參數(shù)嗎?
          JavaScript 代碼:
          function test(fruit) { // 如果有值,則打印 fruit.name if (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?這樣的檢查。
          JavaScript 代碼:
          // 解構(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
          我們還將空對(duì)象?{}?指定為默認(rèn)值。如果我們不這樣做,你將在執(zhí)行行測(cè)試時(shí)遇到test(undefined)?–?Cannot destructure property name of 'undefined' or 'null'.(無(wú)法解析’undefined’或’null’的屬性名稱)。因?yàn)?undefined中 沒有?name?屬性。
          如果您不介意使用第三方庫(kù),有幾種方法可以減少空檢查:
          • 使用?Lodash get?函數(shù)

          • 使用 Facebook 開源的?idx?庫(kù)(需搭配 Babeljs)

          注:如果你還不了解 ES6 中 destructure(解構(gòu)) 的新特性,可以查看 https://www.html.cn/archives/tag/解構(gòu)?這些文章了解更多詳情。
          以下是使用Lodash的示例:
          JavaScript 代碼:
          // 引入 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
          您可以在這里?運(yùn)行演示代碼?。此外,如果你喜歡函數(shù)式編程(FP),您可以選擇使用Lodash fp ,Lodash的函數(shù)式能版本(方法名更改為?get?或?getOr)。

          4、選擇 Map / Object 字面量,而不是Switch語(yǔ)句

          讓我們看看下面的例子,我們想根據(jù)顏色打印水果:
          JavaScript 代碼:
          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']
          上面的代碼似乎沒有錯(cuò),但我覺得它很冗長(zhǎng)。使用具有更清晰語(yǔ)法的 object 字面量可以實(shí)現(xiàn)相同的結(jié)果:
          JavaScript 代碼:
          // 使用對(duì)象字面量,根據(jù)顏色找出對(duì)應(yīng)的水果 const fruitColor = { red: ['apple', 'strawberry'], yellow: ['banana', 'pineapple'], purple: ['grape', 'plum'] };
          function test(color) { return fruitColor[color] || [];}
          或者,您可以使用 Map 來(lái)實(shí)現(xiàn)相同的結(jié)果:
          JavaScript 代碼:
          // 使用 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) || [];}
          Map 是 ES2015(ES6) 引入的新的對(duì)象類型,允許您存儲(chǔ)鍵值對(duì)。
          我們是不是應(yīng)該禁止使用 switch 語(yǔ)句呢?不要局限于此。就個(gè)人而言,我盡可能使用對(duì)象字面量,但我不會(huì)設(shè)置硬規(guī)則來(lái)阻止使用 switch ,是否使用應(yīng)該根據(jù)你的場(chǎng)景而決定。
          Todd Motto 有一篇文章深入地研究了 switch語(yǔ)句與對(duì)象字面量,你可以在?這里?閱讀。

          重構(gòu)語(yǔ)法

          對(duì)于上面的示例,我們實(shí)際上可以使用?Array.filter?來(lái)重構(gòu)我們的代碼,以實(shí)現(xiàn)相同的結(jié)果。
          JavaScript 代碼:
          // 使用 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) || [];}
          總有不止一種方法可以達(dá)到相同的效果。對(duì)于這個(gè)例子我們展示了 4 種實(shí)現(xiàn)方法。編碼很有趣!

          5、使用 Array.every 和 Array.some 來(lái)處理全部/部分滿足條件

          最后一個(gè)小技巧更多地是利用新的(但不是那么新的)Javascript Array函數(shù)來(lái)減少代碼行。查看下面的代碼,我們想檢查所有水果是否都是紅色的:
          JavaScript 代碼:
          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}


          代碼太長(zhǎng)了!我們可以使用?Array.every?減少行數(shù):
          JavaScript 代碼:
          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}
          干凈多了對(duì)吧?類似的,如果我們想要檢查是否有至少一個(gè)水果是紅色的,我們可以使用?Array.some?僅用一行代碼就實(shí)現(xiàn)出來(lái)。
          JavaScript 代碼:
          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}

          總結(jié)
          讓我們一起生成更多可讀代碼。我希望你能在本文中學(xué)到一些新東西。編碼快樂!



          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一区二区三区四区五区六区七区 | 久久成人三级 | 亚洲无码家庭乱论小说区 | 人人爽人人爽人人爽AV片特级 | 91扒开双腿猛进入jk白丝 |