用于解决多个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)()