js中if else的可替代语句

引言

在JavaScript开发中,条件判断语句 if else 的使用频率还是很高的
这里我们在某些特定场景为大家额外提供一种其他的思路。

一、二元逻辑运算符:||

在函数定义时,常有若函数调用未提供参数则使用默认值的情景,当然我们可以使用if else来解决这个问题:

function fn(a) {
    if(!a){
        a = 'test';
    };
};

有没有更优雅的去除做法呢?当然,我们可以使用 || 运算符来实现,如下:

function fn(name) {
    name = name || 'test';
};

二、三元运算符: ? :

三元运算符我想大家都不会陌生,在开发中三元运算的使用场景其实非常多,比如我希望为条件为 true时变量为1,反之为0,通过三元运算符我们可以这样做:

let  B = true;
let num;
if (B) {
    num = 1;
} else {
    num = 0;
};
console.log(num);// 1

改用三元运算符

let B = false,
num;
B ? num = 1 : num = 0;
console.log(num); // 0

有时候在开发中函数常常需要 return 一份数据回去,有时候根据条件不同我们可能要分别对应返回不同的数据,三元一行就可以解决啦:

let fn = function () {
    let flo = true;
    if (flo) {
        return 1;
    } else {
        return 2;
    };
};
let f = fn(); // 1

let fn1 = function () {
    let flo = true;
    // 三元
    return flo ? 1 : 2;
};
let f1 = fn1();//1

三 、switch case

短路求值与三元运算符固然好用,但其实有一个遗憾,它们都只能解决非A即B的条件判断,凡是条件判断超过两种就显得十分无力了。那难道我们只能使用 else if 吗,其实可以使用 switch case

例如A情况我们希望A情况输出a,B情况输出b,C情况输出c,其它情况输出d,用 else ifswitch case分别是这样:

let name = 'B';
//if else if
if (name === 'A') {
    console.log('a');
} else if (name === 'B') {
    console.log('b');
} else if (name === 'C') {
    console.log('c');
} else {
    console.log('d');
};

//switch case
switch (name) {
    case 'A':
        console.log('a');
        break;
    case 'B':
        console.log('b');
        break;
    case 'C':
        console.log('c');
    default:
        console.log('d');
};

四 、 对象配置

如果条件超过三种,else if 写起来不太优雅,switch case代码行数也差不多,就像下面的代码

function formatData(a) {
  let c = "";
  if (a === 1) {
    c = "汉族";
  } else if (a === 2) {
    c = "苗族";
  } else if (a === 3) {
    c = "维吾尔族";
  } else if (a === 4) {
    c = "回族";
  } else if (a === 5) {
    c = "藏族";
  }
 	// ... 等等等等
  
  return c;
}
var result = formatData(2) // 对应的苗族
    

这个要是有64个名族,那我们要写64个else if 啊 ~~,着实有点可怕,那么有没有好的方法呢,看下面代码

const obj = {
  1: "汉族",
  2: "苗族",
  3: "维吾尔族",
  4: "回族",
  5: "藏族",
  // ...等等等等
};
function formatData(a) {
  return obj[a]
}
var result = formatData(2);  // 苗族

上面的代码直接省去64个 else if, 有点小兴奋。

有时候我在实际开发遇到过这样一个情景,我需要根据用户不同的操作类型对同一份数据进行不同加工,比如新增,修改,删除等。那么我用 else if 是这么做的:

function del(){}; // 删除操作
function add(){}; // 新增
function update(){}; // 更新
function process(operateType) {
    if (operateType === 'del') {
        del()
    } else if (operateType === 'add') {
        add()
    } else if (operateType === 'update') {
        update()
    };
};
process('del');// 删除

还有一种很棒的做法就是通过对象配置,将你的操作类型作为key,具体操作的函数作为value,如下:

function del(){}; // 删除操作
function add(){}; // 新增
function update(){}; // 更新
let typeFn = {
    'del': del,
    'add': add,
    'update': update
};
function process(operateType) {
    typeFn[operateType]();
};
process('del'); //删除

当然我们也可以使用 ES6map 数据结构,像这样:

let typeFn = new Map([
    ['del_1', function () {/*do something*/ }],
    ['add_2', function () {/*do something*/ }],
    ['update_3', function () {/*do something*/ }],
]);

function process(operateType, status) {
    typeFn.get(`${operateType}_${status}`)();
};
process('del', 1); // 删除

五 、 数组配置

在处理条件判断时,我们常会遇到条件与对应结果全部已知的情况,比如我们要根据用户的经验设置等级头衔,[0,100)–萌新,[100,200)–骑士,[200,300)–英雄,[300-无限大]–传说,那么用else if怎么写已经没有悬念了:

function youAreMyHero(experience) {
    if (experience < 100) {
        return '萌新';
    } else if (experience < 200 && experience >= 100) {
        return '骑士';
    } else if (experience < 300 && experience >= 200) {
        return '英雄';
    } else if (experience >= 300) {
        return '传说';
    };
};
let level = youAreMyHero(351); //传说

对于这种条件与结果已知的情况,我们其实可以通过数组配置的形式将条件结果抽离出来,像这样:

function youAreMyHero(param) {
    let experience = [300, 200, 100];
    let level = ['传说', '英雄', '骑士', '萌新'];

    for (let i = 0; i < experience.length; i++) {
        if (param >= experience[i]) {
            return level[i];
        };
    };
    return level[level.length - 1];
};

let level = youAreMyHero(250); //英雄

这么做的好处就是便于管理条件与执行结果,如果后面新增了等级判断,我们不用去修改业务逻辑中的 else if 语句长度,只用单纯维护我们抽离的数据即可。

总结

以上,我们大致介绍了五种可取代 if else 的方式,具体还是要看业务需求哦 ~ ~

参考链接

好友链接: 提升代码幸福度,五个技巧减少js开发中的if else语句

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值