编程中代码结构分三种:顺序、分支、循环,并且通过这三种结构的组合,可以实现复杂的逻辑和功能。
顺序结构:最简单的控制结构,按书写的顺序执行每一条语句,从上到下,从左到右,依次执行。
分支结构:根据条件的不同选择执行不同的代码块,常见的分支语句包括但不限于:if 语句、if else 语句,switch-case 语句等;
循环结构:用来重复执行某段代码,直到满足条件不满足为止,常见的包括 for、while 等循环语句。
今天说一下分支结构中 if 语句的注意事项:
要先明确一个基本事实:代码是先给人读的,然后再是给机器读的,所以代码编写的基础就是清晰易懂。
先写正常情况,再写异常情况
在编写代码的时候,把正常出现的情况放到前面来处理,原则是:决策结果代码放在尽可能靠近决策位置。
把最常见的情况放在前面,可以让阅读代码的人最快的了解到常见情况,尽量阅读少量代码,达到最好的阅读效果。
if (score < 0 || score > 100) {
console.log("无效分数");
} else if (score >= 80) {
console.log("良好");
} else if (score >= 60) {
console.log("及格");
} else {
console.log("不及格");
}
在多层 if 语句中,把一致的写在前面,错误情况写在后面,使人的注意力集中到阅读代码的主流程上,而不是费力去理解那些异常情况,整体代码更容易阅读。
出现等号时,弄清楚数据流向
不要随意替换 < 和 <= 的语义,即使自己可以理解明白,但还是需要明确清楚 <= 就是 <=。可以避免我们在访问数组或者计算循环下标时,产生的「越界、偏差」错误。
if 语句后面要跟上有意义的语句
if 子句不要写空子句。
if (SomeTest) {
...
} else {
// do something
}
转换空 if 子句
if (!SomeTest) {
// do something
}
检查 if else 语句是否弄反
本应该放在 if 子句后面的代码和本应该放在 else 子句的代码写反了,要么就是把 if 测试的逻辑写反了,应避免这样的问题。
用函数方法简化程序
对于复杂的 if 条件判断,我们可以抽离成一个函数来简化检测,一般情况下我们会抽离成布尔函数调用。
function isEven(number) {
return number % 2 === 0;
}
function checkEven(number) {
if (isEven(number)) {
console.log(number + " 是偶数");
} else {
console.log(number + " 不是偶数");
}
}
保证覆盖全部情况
即使不需要 else 语句,也要添加一个 else 去捕捉那些考虑不到的情况,子句的内容可以是「出错消息、断言」,最后的 else 消息是给我们开发人员看的,并不是给用户看的。
function isEven(number) {
return number % 2 === 0;
}
function checkEven(number) {
if (typeof number !== 'number') {
console.log("输入不是一个有效的数字");
} else if (isEven(number)) {
console.log(number + " 是偶数");
} else {
console.log(number + " 不是偶数");
}
}
Case 语句
排列顺序
当我们的 case 语句很长的时候,比如 5 个、10 个事件,那么顺序就会变得很重要。
- 把正常的情况放在最前面;
- 按字母顺序或者按数字顺序排列情况;
- 按执行频率来排列子句;
并不是随心排列哈。
function checkDayOfWeek(day) {
switch (day) {
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
console.log("工作日");
break;
case "Saturday":
case "Sunday":
console.log("周末");
break;
default:
console.log("无效的日期");
break;
}
}
默认情况
把 default 子句只用于检查真正的默认情况,当我们只有一种情况需要处理的时候,就可能会把情况编写进 default 子句,虽然这样做很诱人,但却不理智,我们会失去 case 语句提供的说明功能,也会失去 default 子句检测错误的能力。
当我们使用的是伪造的默认情况,那再增加一种新的情况就会非常困难。
应该确认每一个进入 case 子句都是合法的,如果有不合法的就重写它们,让默认子句去执行错误检测。
明确的退出
必须明确的为每一 case 子句写结束语句(break 语句),如果不这样做,程序就会继续执行下一条语句,要习惯把控制结构分开处理。
内容来源:《代码大全第2版》
如果您对本篇文章中提到的问题有任何疑问或想法,请在评论区留言,我将尽力回复。
微信公众号「小道研究」,获取更多关于前端技术的深入分析和实践经验。