js 怎么减少 if else 嵌套, 使用函数封装、三元运算符等
        这篇文章发布于 2021/09/09,归类于 JavaScript
        
        
      
 
      标签:
        js 怎么减少 if else 嵌套,js 怎么减少 if 嵌套,js 怎么减少函数嵌套,js 中 if else 替代写法
      在 if else 或函数嵌套层级较多,代码会逐渐变的难看,不好理解及维护。一般可以通过改变代码组织方式,来减少代码嵌套层级,这里主要介绍下面 5 种方法:
- 将代码块按功能块封装成函数,减少函数内代码的嵌套层级
- if 优化,逻辑假时 true,减少 if 中包含大量代码的情况
- 使用三元运算符减少 if 层级
- 使用逻辑运算符减少 if 层级
- 使用策略模式减少 if、else 层级
来看一个简单的例子,在 vue 实例中,watch 深度监听 userInfo 对象,里面的处理函数中有 if,有数组遍历函数,层级会比较深
<script>
export default {
  data() {
    return {
      userInfo: {}
    };
  },
  watch: {
    userInfo: {
      handler(value) {
        if (value.name) {
          let indexMap = this.arrList.reduce(() => {
            console.log("test1");
            // 可能存在 if 或函数嵌套
          });
          this.list.forEach(item => {
            if (indexMap[item.index]) {
              console.log("test2");
            }
          });
        }
      },
      deep: true
    }
  }
};
</script>
下面来具体看减少代码嵌套层级的几种思路:
1.将代码块按功能块封装成函数
if (condition) {
  let indexMap = this.arrList.reduce(() => {
    console.log("test1");
    // 可能存在的 if 或函数嵌套
  });
}
// 可以优化为下面这种,这样就避免了函数代码直接嵌套在 reduce 方法内部
if (condition) {
  const reduceFunc = () => {
    console.log("test1");
    // 可能存在的 if 或函数嵌套
  }
  let indexMap = this.arrList.reduce(reduceFunc);
}
2. if 优化,逻辑假时 true,减少 if 中包含大量代码的情况
function func() {
  if (condition) {
    // 一大段代码
    // 可能存在 if 等嵌套层级的代码
  }
}
// 可以优化为下面这种,这样可以将一大段代码从 if (condition) 嵌套中解放出来
function func() {
  if (!condition) {
    return false // 条件不满足时结束函数
  }
  // 一大段代码
  // 可能存在 if 等嵌套层级的代码
}
3. 三元运算符
function func() {
  let a = '1'
  if (b) {
    a = '2'
  }
}
// 可以优化为
function func() {
  let a = b ? '2' : '1'
}
4. 逻辑运算符
function func() {
  if (callback) {
    callback()
  }
}
// 可以优化为
function func() {
  callback && callback()
}
5. 策略模式
function func() {
  if (type === 'a') {
    // 执行内容 1
  } else if (type === 'b') {
    // 执行内容 2
  } else if (type === 'c') {
    // 执行内容 3
  }
  // 后续代码
}
// 使用策略模式优化
function func() {
  let handlerA = () => { console.log('执行内容1') }
  let handlerB = () => { console.log('执行内容2') }
  let handlerC = () => { console.log('执行内容3') }
  let handlerMap = {
    a: handlerA,
    b: handlerB,
    c: handlerC
  }
  handlerMap[type] && handlerMap[type]()
  // 后续代码
}
