暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在前端开发中如何减少或取代if-else

晓组智 2021-03-16
1272

最近在开发过程中时常因为项目比较忙,都是先考虑实现功能,最近回首看代码发现很多冗长的if-else判断,今日就写一些自己在替代if-else的一些方案。

1. 参数真假判断 之三元运算符

需求:当a 为或假的时候b的取值也随之发生变化;

  1. let a = true,b = null;

  2. console.time('time1');

  3. if (a) {

  4. b = '你好';

  5. } else {

  6. b = '再见';

  7. }

  8. console.timeEnd('time1'); // => time1: 0.005126953125ms



  9. console.time('time2');

  10. b = a ? '你好' : '再见';

  11. console.timeEnd('time2'); // time2: 0.004150390625ms


上述代码中可以看出两个执行的时间上通过三元运算符执行时间短且想对比较代码整洁;

优:简化代码,减少代码臃肿

缺:只适用于逻辑判断比较简单的;不使用与逻辑复杂的处理;

2. 使用switch case

  1. let a = 3,b = null;

  2. console.time('time1');

  3. if (a === 1) {

  4. console.log('a')

  5. } else if (a === 2) {

  6. console.log('b')

  7. } else if (a === 3) {

  8. console.log('c')

  9. } else {

  10. console.log('d')

  11. }


  12. console.timeEnd('time1'); // => time1: 0.712890625ms



  13. console.time('time2');

  14. switch (a) {

  15. case 1:

  16. console.log('a')

  17. break;

  18. case 2:

  19. console.log('b')

  20. break;

  21. case 3:

  22. console.log('c')

  23. break;

  24. default:

  25. console.log('c')

  26. break;

  27. }

  28. console.timeEnd('time2'); // time2: 0.52392578125ms


总所周知:if-else只是单纯地一个接一个比较;if...else每个条件都计算一遍;

而switch不同 他是通过某个case语句后的值开始,它下方的所有语句都会一直运行,直到遇到一个break为止。

随后,switch语句将结束。

优:美观度高 可识别程度也高。不需要if-else逐个去判断

缺:不适用于多深度的判断。

3.对象的运用

通常后台或给我们返回这样的参数:type:0;// 0:未开始,1:已开始,2:已结束。

这个时候用if-else就有些多余了。我们可以通过创建对象的形式来解决

  1. let option = {

  2. 0: '未开始',

  3. 1: '已开始',

  4. 2: '已结束',

  5. }, type = 2;



  6. option[type];


上述代码可以看出 一行代码即可,

优:使用对象,不需要 if-else 遍历判断, 减少代码的冗长执行机制快;

缺:不利于扩展,因为你option的对象是前端写死的;

4.look-up代替if-else

需求:判断班级里某个学生的分数评级 0-60待努力,61-70加油,71-80良好,81-90优秀,91-99极好,100满分

需求很简单:

  1. let score = 89,rating = null;

  2. console.time('time1');

  3. if (score <= 60) {

  4. rating = '待努力';

  5. } else if (score <= 70) {

  6. rating = '加油';

  7. } else if (score <= 80) {

  8. rating = '良好';

  9. } else if (score <= 90) {

  10. rating = '优秀';

  11. } else if (score <= 99) {

  12. rating = '极好';

  13. } else {

  14. rating = '满分';

  15. }

  16. console.log(rating)


  17. console.timeEnd('time1'); // => time1: 0.546875ms


if-else 太多,且当需求修改的时候维护起来比较麻烦

look-up表实现会怎样呢?

  1. let score = 89,rating = null;

  2. let level = [60, 70, 80, 90, 99, 100];

  3. let levelText = ['待努力', '加油', '良好', '优秀', '极好', '满分'];

  4. for (let i = 0; i < level.length; i++) {

  5. if (score <= level[i]) {

  6. console.log(levelText[i]) // => 优秀

  7. return rating = levelText[i];

  8. }

  9. }


数据与逻辑业务的分离如果有需求修改 只需修改 level与levelText即可逻辑不需要修改;

更近一步的话可以将此方法封装

  1. let level = [60, 70, 80, 90, 99, 100];

  2. let levelText = ['待努力', '加油', '良好', '优秀', '极好', '满分'];

  3. this.leetcode(score, level, levelText);


  4. leetcode (score, level, levelText) {

  5. console.time('time1');

  6. for (let i = 0; i < level.length; i++) {

  7. if (score <= level[i]) {

  8. return levelText[i];

  9. }

  10. }

  11. },


总结:

在判断语句的时候尽量做到数据与逻辑业务的分离,有利于后期的维护。要灵活运用各种特性来完成需求,在大多情况下switch 比if-else运行更快。在使用if-else的时候尽量避免else的使用。


文章转载自晓组智,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论