本文章记录本人在深入学习js条件表达式中看书理解到的一些东西,并且整理记录下来,加深记忆和方便之后的复习。主要是深入学习if else和switch语句的一些性能优化和逻辑思维。
提高条件性能的策略,js的条件表达式和其他语言一样,都采用了if else和switch这两种。由于不同的浏览器对流程控制进行了不同的优化。因此这两种在性能上是没有什么区别的,主要还是根据需求进行分析和选择。
如果条件较小的话选用if else比较合适。
相反,条件数量较大的话,就建议选用switch。
一般来说,if else适用于两个离散的值或者不同的值域。如果判断多个离散值,使用switch更加合适。
在大多数的情况下switch比if else运行的更加快。
恰当的使用 if 与 switch
当我们使用到条件表达式的时候,无论if else还是switch,都应确保下面3哥目标的基本实现:
精确表现事物的内在、固有的逻辑关系。不能为了结构而破坏。
优化逻辑的执行效率。执行效率是程序设计的重要目标,不能为了省事而随意的消耗资源。
简化代码的结构层次,使代码更加容易的阅读。
适合使用if else的情况:
具有复杂的逻辑关系。
表达式的值具有线性特征,如对连续的区间值进行判断。
表达式的值是动态的。
测试任意类型的数据。
适合使用switch的情况:
每句表达式的值。这种是可以期望的、平行逻辑关系的。
表达式的值具有离散性,不具有线性的非连续的区间值。
表达式的值是固定的,不是动态变化的。
表达式的值是有限的,而不是无限的,一般情况下表达式应该比较少。
表达式的值一般为整数、字符串类型的数据。
例如,对学生的分数进行不同的判断,这个时候使用if else就比较合适,因为这种情况,表达式的值是连续的线性判断。
if (socre < 60) {
alert(‘不及格’);
} else if (socre > 60 && socre <= 85) {
alert(‘良好’);
} else if (socre > 86) {
alert(‘优秀’);
}
而判断性别之类的使用switch就比较合适。
switch (sex) {
case ‘男’:
alert(‘先生’);
break;
case ‘女’:
alert(‘女士’);
break;
}
优化 if 逻辑
逻辑顺序体现了人的思维的条理和严密性。合理的顺序可以提升解决问题的品质,相反,混乱的顺序和容易导致各种错误的发生。
人们考虑的东西到时候,都会把最可能发生的情况先做好准备。优化if逻辑的时候也可以这样想:把最可能出现的条件放在前面,把最不可能出现的条件放在后面,这样程序执行时总会按照带啊名的先后顺序逐一检测所有的条件,知道发现匹配的条件才会停止继续检测。
if的优化目标:最小化找到分支之前所判断条件体的数量。if优化的方法:将最常见的条件放在首位。
if (i < 5) {
// 执行一些代码
} else if (i > 5 && i < 10) {
// 执行一些代码
} else {
// 执行一些代码
}
例如上面这个例子,只有在i值经常出现小于5的时候是最优化的。如果i值经常大于或者等于10的话,那么在进入正确的分支之前,就必须两次运算条件体,导致表达式的平均运算时间增加。if中的条件体应该总是按照从最大概率到最小概率排列,以保证理论速度最快。
if 嵌套的思维陷阱
在if语句里面在嵌套一个if语句是一件经常见到的东西,假设有4个调价你,只有当这些条件都符合要求的时候,才会执行某一些事情。遵循一般人的思维习惯,在检测这些条件的时候,常常会沿用下面这种结构嵌套:
if (a) {
if (b) {
if (c) {
if (d) {
alert(‘条件全部成立’);
} else {
alert(‘条件 d 不成立’);
}
} else {
alert(‘条件 c 不成立’);
}
} else {
alert(‘条件 b 不成立’);
}
} else {
alert(‘条件 a 不成立’);
}
从思维的方向性来考虑,这种结构并没有错,使用下面这种if结构来表示可能更加的合适和简单:
if (a && b && c && d) {
alert(‘全部条件成立’);
}
从刚才的代码来说,使用if语句来逐个验证条件的合法性,并且对某个条件是否合法进行了提示,方便我们去追踪每一个条件。但是,如果使用了上面的if结构多重嵌套,就会出现另一种可能:a条件如果不成立的话,就会直接跳出整个嵌套结构,不会去管b,c,d条件是否成立。如果这样做的话,层层包裹的if结构会使代码嵌套过深,难以编辑。
为了解决上面的问题,一般来说会采用排除法,即对每一个条件进行排除,条件全部成立在执行特定的操作。
var t = true;
if (!a) {
t = false;
}
if (!b) {
t = false;
}
if (!c) {
t = false;
}
if (!d) {
t = false;
}
if (t) {
// 条件全部符合要求
}
排除法有效的避免了上面所说的条件结构的多重嵌套问题,且更加符合人的思维模式。当然,也存在一些局限性,一旦发生错误的话,就要放弃后面的操作。如果想要防止这类问题发生,可以在设计一个标示变量来跟踪整个操作行为。
容易在 if 里犯的小错误
不知道大家有木有犯过下面这种错误:
// 第一种
if (i = 1) {
alert(i);
}
// 第二种
if (i = 1) ;
{
alert(i);
}
第一种情况是,有时候会把比较运算=== or ==符错写为赋值运算符=。而且这种错误一般很难发现,由于它是一个合法的表达式,不会导致编译错误。
最后就把常量放在左边,把变量放在右边,这样写的话,就算你把=当作了===来使用也会报错。
if (1 === i) {
alert(i);
}
第二种是,在if的括号后面加了个分号,导致整个结构的逻辑就发生了变化。我们应该牢记条件表达式之后不允许添加分化,最后就通过把大括号与条件表达式写在一行来防止犯错。
if (i) {
alert(i);
}
编写 switch 要注意的地方
千万不要忘记在每一个case语句后面放一个break语句。也可以放一个return或者throw。
防止 switch 贯穿
在switch语句中,除非明确地中断流程,否则每次条件判断后就会贯穿到下一个case条件。在执行switch语句中,js会先计算switch条件的值,然后使用这个值与每个case中的值进行比较,如果相同则执行标签下的语句。在执行的时候如果遇到跳转语句,就会跳出switch结构,否则就会按照顺序执行下去,知道switch语句末尾。如果没有匹配的case的话就会执行default的语句。
switch (a = 3) {
case 3 – 2:
alert(1);
break;
case 1 + 1:
alert(2);
break;
}
上面的switch语句中,case语句只是指明了想要执行代码的起点,并没有指明终点,如果没有在case从句中添加break语句,则会发生连续贯穿现象,从而忽略后面的case从句,这样就会造成switch结构的逻辑混乱.