在js的编码过程当中,条件判断能够说是很是经常使用。当判断条件过多或者逻辑比较复杂时,清晰的代码结构和编码思路显得尤其重要。
需求描述:页面列表-操做列-点击不一样的操做按钮-作不一样的事
下面介绍笔者在编码过程当中,对条件判断语句代码的优化es6
if(params == 'EDIT' ){
//to do
}else if(params == 'VIEW'){
//to do
}else if(params == 'DEL'){
// to do
}
复制代码
总结:if/else是咱们最熟悉且经常使用的结构,可是当判断分支过多时,十几个if/else影响你的心情的同时代码性能也收到了影响,对于代码后期的优化重构,也带来很大困难,这里就不赘述了,读者可自行脑补...。数组
switch(params){
case 'EDIT':
//to do
break
case 'VIEW':
//to do
break
case 'DEL':
//to do
break
default
//to do
break
}
复制代码
总结:switch结构在代码性能上比if/else结构访问效率高的同时,代码总体逻辑结构也显得更加清晰明了缓存
function handleClick(params){
let actions={
'EDIT':function(){},
'VIEW':function(){},
'DEL':function(){},
'default':function(){}
}
return (actions[params] ||actions[default])()
}
//将判断条件做为对象的属性名,将处理逻辑做为对象的属性值
复制代码
js的对象(Object-键值对)传统意义上只能是字符串做为键,在特殊的场景下带来了很大限制;markdown
若是将一个DOM
节点做为键,直接就会被自动转为字符串[object HTMLDivElement]
,ES6提供的Map数据结构,就能够处理这种问题数据结构
//example:
const a =new Map();
const o = {params:'hi siri'};
a.set(o,'hello');
a.get(o)// hello
// main
function handleClick(params){
let actions = new Map([
['EDIT',function(){}],
['VIEW',function(){}],
['DEL',function(){}],
['default',function(){}]
])
return (actions.get(params)||actions.get('default'))()
}
复制代码
到此彷佛一块儿都已经结束了,有读者也许会发文,以上结构适用在一元判断没有问题,若是是二元判断、多元判断以上还可否适用尼?
答案是确定能用,只是在结构和思路上有所调整ide
处理思路:在actions中列出每一个多元判断条件下,所执行的函数步骤,多个传参拼接成字符串,从actions中获取函数函数
需求描述:判断身份,再身份判别的基础上再执行不一样类型的操做,这里以Mao结构举例,Object结构相似oop
/** * identity manager:管理员;guest:客户 * status 1:下单;2:付款;3:取消订单 */
let actions = new Map([
['manager_1',function(){}],
['manager_2',function(){}],
['manaber_3',function(){}],
['guest_1',function(){}],
['guest_3',function(){}],
['guest_3',function(){}],
['default',function(){}]
])
const handleClick=(manager,status)=>{
let action = actions.get[`${manager}_${status}`]||actions.get['default']
action.call(this)
}
复制代码
处理思路:缓存具备共性的函数性能
/** * identity manager:管理员;guest:客户 * status 1:下单;2:付款;3:取消订单 */
let fnA = function(){}
let fnB = function(){}
let actions = new Map([
['manager_1',function(){}],
['manager_2',function(){}],
['manaber_3',function(){}],
['guest_1',fnA],
['guest_2',fnA],
['guest_3',fnA],
['default',function(){}]
])
const handleClick=(manager,status)=>{
let action = actions.get[`${manager}_${status}`]||actions.get['default']
action.call(this)
}
复制代码
处理思路:正则判断参数,动态获取执行函数优化
/** * identity manager:管理员;guest:客户 * status 1:下单;2:付款;3:取消订单 */
const actions = ()=>{
const fnA = ()=>{}
const fnB = ()=>{}
return new Map([
[/^guest_[1-2]$/,fnA],
[/^guest_3$/,fnB],
//...
])
}
const handleClick = (identity,status)=>{
//map类型数据转数组循环
let action = [...actions()].filter(([key,value])=>(key.test(`${identity}_${status}`)))
action.forEach(([key,value])=>value.call(this))
}
// 过滤出符合正则条件的逻辑函数,循环执行
复制代码
此处不作过多介绍Map数据结构及方法,感兴趣的同窗请参考阮一峰老师ECMAScript 6入门
细心的读者可能会发现文中函数声明和调用方式也略有不一样
本文提供了7种判断逻辑结构
需求变化千千万,更多的编码思路值得咱们去发掘,有兴趣的同窗能够来补充。 本文所述内容,若有疑问请随时与笔者联系;如发现问题,欢迎随时指正。