最近部门在对以往的代码作一些优化,我在代码中看到一连串的 if(){}else if(){}
的逻辑判断。这明显是有优化空间的。前端
因为内部代码不适合分享,这里我就用 <输出今天为星期几> 来说讲逻辑判断优化的一些方案。ios
这里先声明,免有人疑惑:npm
咱们在项目中使用的极可能会有多层的嵌套,不像个人例子只有一层。不过其优化的思想是大体相同的。因为 returnWeekday()
方法异常之简单,因此提早声明。数组
写一个
returnWeekday()
方法返回"今天是星期*"。bash
接下来咱们就一步一步来。ide
这里我简单的分为 “初学 —> 入门 —> 中级” 这几个阶段。post
当咱们开始拿到需求的时候,看到一系列的逻辑判断,首先想到的应该就是 if
语句了。学习
代码以下:优化
function returnWeekday(){
let string = "今天是星期";
let date = new Date().getDay();
if (date === 0) {
string += "日";
} else if (date === 1) {
string += "一";
} else if (date === 2) {
string += "二";
} else if (date === 3) {
string += "三";
} else if (date === 4) {
string += "四";
} else if (date === 5) {
string += "五";
} else if (date === 6) {
string += "六";
}
return string
}
console.log(returnWeekday())
复制代码
当咱们写完了这样的代码,第一感受就是 else if
块是否是太多了。ui
但是当咱们还在思考如何优化的时候,产品就在钉钉发消息给你问这个需求完成的怎么样了?还带了一个坏笑的表情包。这个时候你告诉本身,这个优化后面再说吧。但是长此以往,需求加之。这个再也没有优化过了,直到下一个接手。
上面的代码确实 else if
块太多了,看着就不舒服。
咱们在看《JavaScript 高级程序设计》的时候,看到这样一句话:
switch
语句与if
语句的关系最为密切,并且也是在其余语言中广泛使用的一种流控制语句。
因此咱们是否是能够考虑使用 switch
语句来优化一下呢?
这里咱们使用 switch
语句优化一遍代码。
注意:
switch
语句在比较值的时候使用的是全等操做符,不会有类型转换的状况。
代码以下:
function returnWeekday(){
let string = "今天是星期";
let date = new Date().getDay();
switch (date) {
case 0 :
string += "日";
break;
case 1 :
string += "一";
break;
case 2 :
string += "二";
break;
case 3 :
string += "三";
break;
case 4 :
string += "四";
break;
case 5 :
string += "五";
break;
case 6 :
string += "六";
break;
}
return string
}
console.log(returnWeekday())
复制代码
咱们在 case
里面拼接字符,以达到输出预期结果的目的。这里的结构看起来确实比 if
语句清晰了一点。但是仍是有点疑惑?
假设哪一天,相关组织发现,星象有变。每周须要变成八天(产品的思惟,你没法想象)。咱们这个
returnWeekday()
方法就须要多加一层判断了。
咱们的但愿是已经封装好的方法,不要频繁的修改。但是需求的变更是你没法控制的。
因此咱们继续思考该怎么优化。
咱们看到这里的 case
是数字,和数组的下标是一致的。
即:['天','一','二','三','四','五','六']
的下标。
因此咱们能够考虑使用数组来优化。
代码以下:
function returnWeekday(){
let string = "今天是星期";
let date = new Date().getDay();
// 使用数组
let dateArr = ['天','一','二','三','四','五','六'];
return string + dateArr[date]
}
console.log(returnWeekday())
复制代码
以上代码是否是比 switch
语句和 if
语句清晰多了。并且就算一周变为八天,只须要修改 dateArr
数组就行了。
假若咱们的每一个
case
是不规律的字符串呢?那咱们使用对象,每一个case
为一个key
代码以下:
function returnWeekday(){
let string = "今天是星期";
let date = new Date().getDay();
// 使用对象
dateObj = {
0: '天',
1: "一",
2: "二",
3: "三",
4: "四",
5: "五",
6: "六",
};
return string + dateObj[date]
}
console.log(returnWeekday())
复制代码
以上使用数组或者对象的写法,提升代码的可读性的同时,维护起来也变得简单了。
字符串有个和使用数组下标相似的方法:
// charAt 定位方法
function returnWeekday(){
return "今天是星期" + "日一二三四五六".charAt(new Date().getDay());
}
console.log(returnWeekday())
复制代码
这个时候,有人但愿 returnWeekday()
方法不只返回今天是周几,还须要区分工做日和休息日,调用相关方法。
若是是使用 switch
、if
或 数组
维护起来就有点麻烦,须要改写的地方还挺多的。
function returnWeekday(){
let string = "今天是星期";
let date = new Date().getDay();
// 使用对象
dateObj = {
0: ['天','休'],
1: ["一",'工'],
2: ["二",'工'],
3: ["三",'工'],
4: ["四",'工'],
5: ["五",'工'],
6: ["六",'休'],
}
// 类型,这里也能够对应相关方法
dayType = {
'休': function(){
// some code
console.log('为休息日')
},
'工': function(){
// some code
console.log('为工做日')
}
}
let returnData = {
'string' : string + dateObj[date][0],
'method' : dayType[dateObj[date][1]]
}
return returnData
};
console.log(returnWeekday().method.call(this))
复制代码
这里在给出一些常见的优化手段。
适合简单的 if(){}else{}
状况。
//滚动监听,头部固定
handleScroll: function () {
let offsetTop = this.$refs.pride_tab_fixed.getBoundingClientRect().top;
if( offsetTop < 0 ){
this.titleFixed = true
} else {
this.titleFixed = false
}
// 改为三元
(offsetTop < 0) ? this.titleFixed = true : this.titleFixed = false;
// 咱们发现条件块里面的赋值状况是布尔值,因此能够更简单
this.titleFixed = offsetTop < 0;
}
复制代码
这样在精简代码的时候,可读性也没有下降。
有些时候咱们可使用逻辑与运算符来简化代码
if( falg ){
someMethod()
}
复制代码
能够改为:
falg && someMethod();
复制代码
includes
处理多重条件if( code === '202' || code === '203' || code === '204' ){
someMethod()
}
复制代码
能够改为
if( ['202','203','204'].includes(code) ){
someMethod()
}
复制代码
最近总有朋友问我 Vue 相关的问题,所以接下来我会输出 10 篇 Vue 相关的文章,但愿对你们有必定的帮助。我会保持在 7 到 10 天更新一篇。
建议你关注个人公众号,第一时间就能够接收最新的文章。
若是你想加群交流,能够自行扫码入群: