zoukankan      html  css  js  c++  java
  • js集合es6判断条件使用技巧技巧

    1. 多重判断中使用Array.includes

    // condition
    function test(fruit) {
      if (fruit == 'apple' || fruit == 'strawberry') {
        console.log('red');
      }
    }

    如果添加更多的红色的水果,比如cherrycranberries,那会怎样呢?你会使用更多的||来扩展条件语句吗?

    我们可以通过Array.includes(params)来重写上面的条件语句。如下:

    function test(fruit) {
      // extract conditions to array
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    
      if (redFruits.includes(fruit)) {
        console.log('red');
      }
    }

    我们提取red fruits(条件判断)到一个数组中。通过这样做,代码看起来更加整洁了。

    2. 少嵌套,早返回

    我们扩展上面的例子,让它包含多两个条件:

    • 如果没有传入fruit参数,抛出错误
    • 接受quantity参数并在其超出10打印出来
    function test(fruit, quantity) {
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    
      // condition 1: fruit must has value
      if (fruit) {
        // condition 2: must be red
        if (redFruits.includes(fruit)) {
          console.log('red');
    
          // condition 3: must be big quantity
          if (quantity > 10) {
            console.log('big quantity');
          }
        }
      } else {
        throw new Error('No fruit!');
      }
    }
    
    // test results
    test(null); // error: No fruits
    test('apple'); // print: red
    test('apple', 20); // print: red, big quantity

    看下上面的代码,我们捋下:

    • 1个if/else语句筛出无效的条件语句
    • 3层嵌套的语句(条件1,2和3)

    我个人遵守的准则是发现无效的条件时,及早return。

    /_ return early when invalid conditions found _/
    
    function test(fruit, quantity) {
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    
      // condition 1: throw error early
      if (!fruit) throw new Error('No fruit!');
    
      // condition 2: must be red
      if (redFruits.includes(fruit)) {
        console.log('red');
    
        // condition 3: must be big quantity
        if (quantity > 10) {
          console.log('big quantity');
        }
      }
    }

    通过及早return,我们减少了一层嵌套语句。这种编码风格很赞,尤其是当你有很长的if语句(可以想象下你需要滚动很长才知道有else语句,一点都不酷)。

    (针对上面例子)我们可以通过倒置判断条件和及早return来进一步减少if嵌套。看下面我们是怎么处理条件2的:

    /_ return early when invalid conditions found _/
    
    function test(fruit, quantity) {
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    
      if (!fruit) throw new Error('No fruit!'); // condition 1: throw error early
      if (!redFruits.includes(fruit)) return; // condition 2: stop when fruit is not red
    
      console.log('red');
    
      // condition 3: must be big quantity
      if (quantity > 10) {
        console.log('big quantity');
      }
    }

    通过倒置条件2,我们避免了嵌套语句。这个技巧很有用:当我们处理很长的逻辑,并且希望能够在条件不满足时能够停下来进行处理。

    而且,这样做并不难。问下自己,这个版本(没有条件嵌套)是不是比之前版本(两层嵌套)更好/可读性更高呢?

    但是,对于我来说,我会保留先前的版本(包含两层嵌套)。因为:

    • 代码较短且直接,嵌套if更加清晰
    • 倒置判断条件可能增加思考负担(增加认知负荷)

    因此,应当尽量减少嵌套和及早return,但是不要过度。如果你感兴趣,你可以看下面的一篇文章和StackOverflow上的讨论,进一步了解:

  • 相关阅读:
    hdu 2647 Reward
    hdu 2094 产生冠军
    hdu 3342 Legal or Not
    hdu 1285 确定比赛名次
    hdu 3006 The Number of set
    hdu 1429 胜利大逃亡(续)
    UVA 146 ID Codes
    UVA 131 The Psychic Poker Player
    洛谷 P2491消防 解题报告
    洛谷 P2587 [ZJOI2008]泡泡堂 解题报告
  • 原文地址:https://www.cnblogs.com/JeneryYang/p/10334411.html
Copyright © 2011-2022 走看看