乐趣区

关于前端:JavaScript-代码逻辑判断的优化

咱们日常应用到的逻辑判断语句有 if...else...switch...case...do...while... 等。

在简略场景下,咱们可能对这些语法的性能没有什么感觉,但当遇到简单的业务场景时,如果解决不善,就会呈现大量的逻辑嵌套,可读性差并且难以扩大。

千里之行始于足下,编写高可维护性和高质量的代码,咱们就须要从细节处动手,咱们明天次要探讨 JavaScript 中如何优化逻辑判断代码。

嵌套层级优化

function supply(fruit, quantity) {const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    // 条件 1: 水果存在
    if (fruit) {
        // 条件 2: 属于红色水果
        if (redFruits.includes(fruit)) {console.log('红色水果');
            // 条件 3: 水果数量大于 10 个
            if (quantity > 10) {console.log('数量大于 10 个');
            }
        }
    } else {throw new Error('没有水果啦!');
    }
}

通过下面这个例子,咱们能够看到:判断流程中规中矩,合乎事实世界的映射。然而,因代码层层嵌套,导致浏览和保护都存在艰难。

如果传入了 fruit 参数,则每次执行都至多须要通过两步 if 判断,在性能上也存在问题。

咱们来对下面的代码进行一下优化解决:

function supply(fruit, quantity) {const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    if (!fruit) throw new Error('没有水果啦');     // 条件 1: 当 fruit 有效时,提前处理错误
    if (!redFruits.includes(fruit)) return; // 条件 2: 当不是红色水果时,提前 return

    console.log('红色水果');

    // 条件 3: 水果数量大于 10 个
    if (quantity > 10) {console.log('数量大于 10 个');
    }
}

这里次要对嵌套层级做了优化,提前终止掉了不合乎的条件,将三层嵌套缩小到了一层,简化了代码后果构造,加强了可浏览性。

多条件分支的优化

置信咱们很多人对上面这种代码不生疏吧?(想想刚开始写代码那会啊)

function pick(color) {
    // 依据色彩抉择水果
    if (color === 'red') {return ['apple', 'strawberry'];
    } else if (color === 'yellow') {return ['banana', 'pineapple'];
    } else if (color === 'purple') {return ['grape', 'plum'];
    } else {return [];
    }
}

咱们须要晓得一点准则:if else 更适宜于条件区间判断,而 switch case 更适宜于具体枚举值的分支判断。

咱们应用 switch…case… 进行一下改写:

function pick(color) {
    // 依据色彩抉择水果
    switch (color) {
        case 'red':
            return ['apple', 'strawberry'];
        case 'yellow':
            return ['banana', 'pineapple'];
        case 'purple':
            return ['grape', 'plum'];
        default:
            return [];}
}

switch...case... 优化之后的代码看上去格局参差,思路很清晰,但还是很简短。持续优化:

  • 借助 Object 的 {key: value} 构造,咱们能够在 Object 中枚举所有的状况,而后将 key 作为索引,间接通过 Object.key 或者 Object[key] 来获取内容:
const fruitColor = {red: ['apple', 'strawberry'],
    yellow: ['banana', 'pineapple'],
    purple: ['grape', 'plum'],
}
function pick(color) {return fruitColor[color] || [];}
  • 应用 Map 数据结构,真正的 (key, value) 键值对构造:
const fruitColor = new Map()
    .set('red', ['apple', 'strawberry'])
    .set('yellow', ['banana', 'pineapple'])
    .set('purple', ['grape', 'plum']);

function pick(color) {return fruitColor.get(color) || [];}

优化之后,代码更简洁、更容易扩大。

为了更好的可读性,还能够通过更加语义化的形式定义对象,而后应用 Array.filter 达到同样的成果:

const fruits = [{name: 'apple', color: 'red'},
    {name: 'strawberry', color: 'red'},
    {name: 'banana', color: 'yellow'},
    {name: 'pineapple', color: 'yellow'},
    {name: 'grape', color: 'purple'},
    {name: 'plum', color: 'purple'}
];

function pick(color) {return fruits.filter(f => f.color == color);
}

总结

下面应用的例子和伎俩都比拟高级,然而其中的思维却值得咱们细品,心愿大家可能有所播种!

学习乏味的常识,结识乏味的敌人,塑造乏味的灵魂!

大家好!我是〖编程三昧〗的作者 隐逸王 ,我的公众号是『编程三昧』,欢送关注,心愿大家多多指教!

常识与技能并重,内力和外功兼修,实践和实际两手都要抓、两手都要硬!

退出移动版