js分发模式 不用if

用于解决多个if或者switch case的不优雅写法。
目前直接搜到的代替switch的方法大多是错的,例如

https://blog.csdn.net/tengxi_5290/article/details/108357942

这两种方法都没考虑到代码被执行的问题,运行switch case,不是相同case的代码不会被执行。验证:定义一个a=0,在每个case中都a++,最后a=1,用上面文章的两种方法最后a都不仅仅是1。


有些时候不用考虑代码执行,也就是我们不关心是否执行,比如这个案例:输入1返回red,-1返回green。

// 简略版分发模式,同上文的两种方法
((e) => ({
          '1': 'red',
          '-1': 'green'
        })[e] || 'black')('-1')

当需要考虑代码执行的时候,比如这个案例:判空:null,{},[],‘’,undefined 为空。
如果依旧用简略版分发模式/上文的两种方法,就会报错,这个报错也证明了执行顺序和switch case不同。

// 当入参为123456没问题,当入参为null或者undefined就有问题了,因为这两个没有.length方法
let typeStr = Object.prototype.toString.call('123456')
  return ((e) => ({
    '[object String]': a === '',
    '[object Undefined]': true,
    '[object Null]': true,
    '[object Array]': a.length === 0,
    '[object Object]': Object.keys(a).length === 0
  })[e] || false)(typeStr)
  // 不难看出,简略版分发模式/上文的两种方法都是全部执行了,再放进去,再匹配
  // -------------------
  // 完整版分发模式应该是先放进去,在匹配,再执行 写法如下
  let typeStr = Object.prototype.toString.call(a)
  return ((e) => ({
    '[object String]': () => a === '',
    '[object Undefined]': () => true,
    '[object Null]': () => true,
    '[object Array]': () => a.length === 0,
    '[object Object]': () => Object.keys(a).length === 0
  })[e] || false)(typeStr)()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值