javascript 简洁之道 判断篇
第一个例子
if (state === 1) { return true } else if (state === 2) { return true } else if (state === 3) { return true } else if (state === 4){ return true } else { return false }
你首先想到的可能是 使用 switch case
switch (state) { case 1: return true break; case 2: return true break; case 3: return true break case 4: return true break default: return false break }
看起来有条理了, 观察发现:
- 都是判断 state
- 都是 return true
我们用 Array.includes 来优化它:
const states = [1, 2, 3, 4] if (states.includes(state) { return true }
- 代码更精简
- 更易于维护
如果不是做相同的事情呢?
if (state === 1) { // do something } else if (state === 2) { // do something } else if (state === 3) { // do something } else if (state === 4){ // do something } else { // do something }
我们可以这样来优化它:
const actions = { 1: () => { /*do something*/ }, 2: () => { /*do something*/ }, 3: () => { /*do something*/ }, 4: () => { /*do something*/ }, 'default': () => { /*do something*/ } } actions[state]() || actions['default']();
- 可读性更高
- 更易于维护
第二个例子
if (type === 'firstType') { if (state === 1) {/*do something*/ // do something } else if (state === 2) { // do something } else if (state === 3) { // do something } else if (state === 4){ // do something } else { // do something } } else if (type === 'secondType') { if (state === 1) { // do something } else if (state === 2) { // do something } else if (state === 3) { // do something } else if (state === 4){ // do something } else { // do something } }
仿照上面的例子稍加变动我们就能将它优化:
const actions = { 'firstType_1': ()=>{ /*do something*/ }], 'firstType_2': ()=>{ /*do something*/ }], 'firstType_3': ()=>{ /*do something*/ }], 'firstType_4': ()=>{ /*do something*/ }], 'secondType_1': ()=>{ /*do something*/ }], 'secondType_2': ()=>{ /*do something*/ }], 'secondType_3': ()=>{ /*do something*/ }], 'secondType_4': ()=>{ /*do something*/ }], 'default': ()=>{ /*do something*/ }] } const action = actions[`${type}_${state}`] || actions['default']
我们还可以使用 Map 来优化它:
const actions = new Map([ ['firstType_1', ()=>{ /*do something*/ }], ['firstType_2', ()=>{ /*do something*/ }], ['firstType_3', ()=>{ /*do something*/ }], ['firstType_4', ()=>{ /*do something*/ }], ['secondType_1', ()=>{ /*do something*/ }], ['secondType_2', ()=>{ /*do something*/ }], ['secondType_3', ()=>{ /*do something*/ }], ['secondType_4', ()=>{ /*do something*/ }], ['default', ()=>{ /*do something*/ }] ]) const action = actions.get(`${type}_${state}`) || actions.get('default')
我们使用 Map 虽然可以达到相同的效果,我们发现这样稍微复杂了一些,但是我们可以用它来处理更复杂的情况。
Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
我们假设 firstType 中 state 为 1-3 都做相同的事,那么可以这样写:
const actions = new Map([ ['/^firstType_[1-3]$/', ()=>{ /*do something*/ }], ['firstType_4', ()=>{ /*do something*/ }], // ... ['default', ()=>{ /*do something*/ }] ])
很显然使用正则表达式能够减少重复的代码, 也能带来更多可能性。
如果对应的方法中出现大量逻辑代码,那么我们可以将 actions 封装为一个函数:
const actions = () => { const fn1 = () => {} const fn2 = () => {} return new Map([ ['/^firstType_[1-3]$/', fn1], ['firstType_4', fn2], // ... ]) }
参考资料:
来源:https://www.cnblogs.com/guangzan/p/12219207.html