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