前端代码逻辑优化

一、判断逻辑优化

这是连续嵌套的判断逻辑,要怎么优化呢?

function checkStatus() {
  if (isLogin()) {
    if (isVip()) {
      if (isDoubleCheck()) {
        done();
      } else {
        throw new Error("不要重复点击");
      }
    } else {
      throw new Error("不是会员");
    }
  } else {
    throw new Error("未登录");
  }
}

通常这种,为了处理特殊状况,所实现的判断逻辑,都可以采用 “异常逻辑前置,正常逻辑后置” 的方式进行梳理优化

// 将判断逻辑的异常逻辑提前,将正常逻辑后置
function checkStatus() {
  if (!isLogin()) {
    throw new Error('未登录');
  }

  if (!isVip()) {
    throw new Error('不是会员');
  }

  if (!isDoubleCheck()) {
    throw new Error('不要重复点击');
  }

  done();
}

二、函数传参优化

像这种行参有很多

// 形参有非常多个
const getMyInfo = (
  name,
  age,
  gender,
  address,
  phone,
  email,
) => {
  // ...
}
  • 传实参是的时候,不仅需要知道传入参数的个数,还得知道传入顺序
  • 有些参数非必传,还要注意添加默认值,且编写的时候只能从形参的后面添加,很不方便
  • 所以啊,那么多的形参,会有很大的心智负担

怎么优化呢?

优化建议

// 行参封装成对象,对象函数内部解构
const getMyInfo = (options) => {
  const { name, age, gender, address, phone, email } = options;
  // ...
}

getMyInfo(
  {
    name: '张三',
    age: 18,
    gender: '男',
    address: '北京',
    phone: '123456789',
    email: '123456789@qq.com'
  }
)

三、命名注释优化

1. 避免魔法数字

// 魔法数字
if (state === 1 || state === 2) {
  // ...
} else if (state === 3) {
  // ...
}

咋一看,这 1、2、3 又是什么意思啊?这是判断啥的?

语义就很不明确,当然,你也可以在旁边写注释

更优雅的做法是,将魔法数字改用常量

这样,其他人一看到常量名大概就知道,判断的是啥了

// 魔法数字改用常量
const UNPUBLISHED = 1;
const PUBLISHED = 2;
const DELETED = 3;

if (state === UNPUBLISHED || state === PUBLISHED) {
  // ...
} else if (state === DELETED) {
  // ...
}

2. 注释别写只表面意思

注释的作用:提供代码没有提供的额外信息

// 无效注释
let id = 1 // id 赋值为 1

// 有效注释,写业务逻辑 what & why
let id = 1 // 赋值文章 id 为 1

四、分支逻辑优化

什么是分支逻辑呢?

使用 if else、switch case ...,这些都是分支逻辑

// switch case
const statusMap = (status: string) => {
    switch(status) {
        case 'success':
            return 'SuccessFully'
        case 'fail':
            return 'failed'
        case 'danger'
            return 'dangerous'
        case 'info'
            return 'information'
        case 'text'
            return 'texts'
        default:
            return status
    }
}
// if else
const statusMap = (status: string) => {
    if(status === 'success') return 'SuccessFully'
    else if (status === 'fail') return 'failed'
		else if (status === 'danger') return 'dangerous'
    else if (status === 'info') return 'information'
    else if (status === 'text') return 'texts'
    else return status
}

这些处理逻辑,我们可以采用 映射代替分支逻辑

// 使用映射进行优化
const STATUS_MAP = {
    'success': 'Successfull',
    'fail': 'failed',
    'warn': 'warning',
    'danger': 'dangerous',
    'info': 'information',
    'text': 'texts'
}

return STATUS_MAP[status] ?? status

【扩展】

??TypeScript 中的 “空值合并操作符”

当前面的值为 null 或者 undefined 时,取后面的值

五、对象赋值优化

// 多个对像属性赋值
const setStyle = () => {
    content.body.head_style.style.color = 'red'
    content.body.head_style.style.background = 'yellow'
  	content.body.head_style.style.width = '100px'
  	content.body.head_style.style.height = '300px'
  	// ...
}

这样一个个赋值太麻烦了,全部放一起赋值不就行了

可能,有些同学就这样写

const setStyle = () => {
  	content.body.head_style.style = {
      color: 'red',
      background: 'yellow',
      width: '100px',
      height: '300px'
    }
}

咋一看,好像没问题了呀?那 style 要是有其他属性呢,其他属性不就直接没了吗~

const setStyle = () => {
  	content.body.head_style.style = {
      ...content.body.head_style.style
      color: 'red',
      background: 'yellow',
      width: '100px',
      height: '300px'
    }
}

采用展开运算符,将原属性插入,然后从后面覆盖新属性,这样原属性就不会丢了

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值