<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個技巧讓你更好的編寫 JavaScript(ES6) 中條件語句

          共 7301字,需瀏覽 15分鐘

           ·

          2020-08-29 15:10

          英文 |?https://scotch.io/bar-talk/5-tips-to-write-better-conditionals-in-javascript
          譯文 |?https://www.html.cn/archives/9865

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

          1、使用 Array.includes 來處理多個條件

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

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

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

          2、減少嵌套,提前使用 return 語句

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

          • 接受水果?quantity(數(shù)量)參數(shù),如果超過 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!'); }}
          // 測試結(jié)果test(null); // 拋出錯誤:No fruitstest('apple'); // 打印:redtest('apple', 20); // 打印:red,big quantity

          看看上面的代碼,我們有:
          – 1 個 if / else 語句過濾掉無效條件
          – 3 層 if 語句嵌套(分別是條件1,2和3)
          我個人遵循的一般規(guī)則是?在發(fā)現(xiàn)無效條件時提前 return
          JavaScript 代碼:
          /* 在發(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ù)量必須大于 10 if (quantity > 10) { console.log('big quantity'); } }}

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

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

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

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

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

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

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

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

          更簡單直觀不是嗎?請注意,每個函數(shù)參數(shù)都有自己的默認值。例如,我們也可以為?fruit?分配一個默認值:function test(fruit = 'unknown', quantity = 1)
          注:如果你還不了解 ES6 中函數(shù)默認參數(shù)的新特性,可以查看 JavaScript 函數(shù)中默認參數(shù)?了解更多詳情。
          如果我們的 fruit 是一個 Object 對象怎么辦?我們可以指定默認參數(shù)嗎?
          JavaScript 代碼:
          function test(fruit) { // 如果有值,則打印 fruit.name if (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?這樣的檢查。
          JavaScript 代碼:
          // 解構(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)

          注:如果你還不了解 ES6 中 destructure(解構(gòu)) 的新特性,可以查看 https://www.html.cn/archives/tag/解構(gòu)?這些文章了解更多詳情。
          以下是使用Lodash的示例:
          JavaScript 代碼:
          // 引入 lodash 庫,我們將獲得 _.get()function test(fruit) { console.log(_.get(fruit, 'name', 'unknown'); // 獲取 name 屬性,如果沒有分配,則設(shè)為默認值 unknown}
          //測試結(jié)果test(undefined); // unknowntest({ }); // unknowntest({ name: 'apple', color: 'red' }); // apple
          您可以在這里?運行演示代碼?。此外,如果你喜歡函數(shù)式編程(FP),您可以選擇使用Lodash fp ,Lodash的函數(shù)式能版本(方法名更改為?get?或?getOr)。

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

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

          重構(gòu)語法

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

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

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

          代碼太長了!我們可以使用?Array.every?減少行數(shù):
          JavaScript 代碼:
          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)出來。
          JavaScript 代碼:
          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}

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

          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  国产玖玖精品 | 国产传媒午夜成人 | 中国一级毛片视频 | 青娱乐在线成人 | 夜夜夜久久久 |