JavaScript(ES6)逻辑判断条件优化

╰+哭是因爲堅強的太久メ 2021-06-26 16:06 504阅读 0赞

javascript-判断(if…else…)优化


1、使用Array.includes

  1. function test(fruit){
  2. if(fruit == 'apple' || fruit == 'watermelon') {
  3. console.log('red')
  4. }
  5. }

从上面的例子看,在判断的条件较少的时候,这种写法是没什么问题的,但是如果我们需要判断更多的红色水果,那么就需要更多的||操作符来拓展语句。

这时候可以使用Array.includes重写条件语句。

  1. function test(fruit) {
  2. // 条件提取到数组中
  3. const redFruits = ['apple','strawberry','cherry','watermelon']
  4. if(redFruits.includes(fruit)){
  5. console.log('red')
  6. }
  7. }
  8. test('apple')

2、使用return语句减少if嵌套

  • 如果没有水果,抛出错误
  • 水果quantity参数,如果超过10,则打印信息

    function test(fruit, quantity){
    const redFruits = [‘apple’,’strawberry’,’cherry’,’watermelon’]
    // 条件1,fruit必须有值
    if(fruit){

    1. // 条件2,必须为红色
    2. if(redFruits.includes(fruit)){
    3. console.log('red')
    4. }
    5. // 条件3,数量必须大于10
    6. if(quantity>10){
    7. console.log('big quantity')
    8. }

    }else {

    1. throw new Error('No fruit!')

    }
    }
    test(null) // No fruit
    test(‘apple’) // red
    test(‘apple’, 20) // red, big quantity

从上面的代码来看,首先一个if/else过滤无效条件,3层if语句嵌套。

return改造,将无效的条件提前筛选出来。

  1. function test(fruit, quantity){
  2. const redFruits = ['apple', 'watermelon','cherry','strawberry']
  3. if(!fruit) throw new Error('No fruit')
  4. if(redFruits.includes(fruit)){
  5. console.log('red')
  6. }
  7. if(quantity>10){ console.log('big quantity') }
  8. }

或者

  1. function test(fruit, quantity){
  2. const redFruits = ['apple','strawberry','cherry','watermelon']
  3. if(!fruit) throw new Error('No fruit!')
  4. if(!redFruits.includes(fruit)) return
  5. console.log('red')
  6. if(quantity>10){
  7. console.log('big quantity')
  8. }
  9. }

3、函数的默认参数和解构

在函数中,我们经常要对nullundefined作出默认值的处理。

  1. function test(fruit,quantity){
  2. if(!fruit) return;
  3. const q = quantity || 1;
  4. console.log(`We have ${ q} ${ fruit}!`)
  5. }
  6. test('banana') // We have 1 banana
  7. test('apple', 2) // We have 2 apple

es6的默认参数方式来改写,直接给函数参数分配一个默认值:

  1. function test(fruit,quantity=1){
  2. if(!fruit) return;
  3. console.log(`We have ${ q} ${ fruit}!`)
  4. }
  5. test('banana') // We have 1 banana
  6. test('apple', 2) // We have 2 apple

如果传入的参数为对象,是否可以指定默认参数呢?

  1. function test(fruit){
  2. if(fruit && fruit.name) {
  3. console.log(fruit.name);
  4. } else {
  5. console.log('unknown')
  6. }
  7. }
  8. test(undefined) // unknown
  9. test({ }) //unknown
  10. test({ name:'apple',color:'red'}) // apple

我们想要的是如果 fruit.name 存在则打印水果名称,否则将打印 unknown 。我们可以使用默认函数参数和解构(destructing) 来避免 fruit && fruit.name 这样的检查。

  1. // 只获得name属性
  2. // 参数默认分配空对象
  3. function test({ name}={ }){
  4. console.log(name || 'unknown')
  5. }
  6. test(undefined) // unknown
  7. test({ }) //unknown
  8. test({ name:'apple',color:'red'}) // apple

由于我们只需要来自 fruitname 属性,我们可以使用 {name} 来解构参数,然后我们可以在代码中使用 name 作为变量来取代fruit.name

我们还将空对象 {} 指定为默认值。 如果我们不这样做,你将在执行行测试时遇到test(undefined) – Cannot destructure property name of ‘undefined’ or ‘null’.(无法解析’undefined’或’null’的属性名称)。 因为 undefined中 没有 name 属性

4、Map/Object替代switch

  1. function test(color) {
  2. // 使用 switch case 语句,根据颜色找出对应的水果
  3. switch (color) {
  4. case 'red':
  5. return ['apple', 'strawberry'];
  6. case 'yellow':
  7. return ['banana', 'pineapple'];
  8. case 'purple':
  9. return ['grape', 'plum'];
  10. default:
  11. return [];
  12. }
  13. }
  14. //测试结果
  15. test(null); // []
  16. test('yellow'); // ['banana', 'pineapple']

object字面量可以实现相同的结果,减少代码量。

  1. const fruitColor = {
  2. red: ['apple','strawberry'],
  3. yellow: ['banana','pineapple'],
  4. purple: ['grape', 'plum']
  5. }
  6. function test(color){
  7. return fruitColor[color] || []
  8. }
  9. }

用Map的实现方式:

  1. const fruitColor = new Map()
  2. .set('red', ['apple', 'strawberry'])
  3. .set('yellow', ['banana', 'pineapple'])
  4. .set('purple', ['grape', 'plum']);
  5. function test(color) {
  6. return fruitColor.get(color) || [];
  7. }

对于上面的示例,还可以使用Array.filter来实现:

  1. const fruits = [
  2. { name: 'apple', color: 'red' },
  3. { name: 'strawberry', color: 'red' },
  4. { name: 'banana', color: 'yellow' },
  5. { name: 'pineapple', color: 'yellow' },
  6. { name: 'grape', color: 'purple' },
  7. { name: 'plum', color: 'purple' }
  8. ];
  9. function test(color) {
  10. // 使用 Array filter ,根据颜色找出对应的水果
  11. return fruits.filter(f => f.color == color); // 返回的是一个数组
  12. }

5、Array.everyArray.some 来处理全部/部分满足条件

  1. const fruits = [
  2. { name: 'apple', color: 'red' },
  3. { name: 'banana', color: 'yellow' },
  4. { name: 'grape', color: 'purple' }
  5. ];
  6. function test() {
  7. let isAllRed = true;
  8. // 条件:所有的水果都必须是红色
  9. for (let f of fruits) {
  10. if (!isAllRed) break;
  11. isAllRed = (f.color == 'red');
  12. }
  13. console.log(isAllRed); // false
  14. }

使用Array.every,这个数组全满足某条件

  1. const fruits = [
  2. { name: 'apple', color: 'red' },
  3. { name: 'banana', color: 'yellow' },
  4. { name: 'grape', color: 'purple' }
  5. ];
  6. function test() {
  7. // 条件:简短方式,所有的水果都必须是红色
  8. const isAllRed = fruits.every(f => f.color == 'red');
  9. console.log(isAllRed); // false
  10. }

使用Array.some,这个数组是否有一个满足条件

  1. const fruits = [
  2. { name: 'apple', color: 'red' },
  3. { name: 'banana', color: 'yellow' },
  4. { name: 'grape', color: 'purple' }
  5. ];
  6. function test() {
  7. // 条件:简短方式,所有的水果都必须是红色
  8. const isAnyRed = fruits.some(f => f.color == 'red');
  9. console.log(isAnyRed); // true
  10. }

发表评论

表情:
评论列表 (有 0 条评论,504人围观)

还没有评论,来说两句吧...

相关阅读

    相关 6. Python的条件判断

    表达式 * 什么是表达式? 表达式是运算符和操作数所构成的序列。 * 表达式的优先级: 表达式的优先级其实就是运算符的优先级所决定的。 <table>...