JS三板斧——流程控制
1.判断语句
前言:在js中判断语句的存在是非常广泛的,我们可以根据判断条件的数目选择合适的判断语句,条件比较少时,使用if/else if/else,条件比较多时用switch,条件非常多的时候可以将条件弄成一个数组,然后用查找的方式进行判断。
-
if/else if/else
在单条件下,判断true和false不一定要使用或者=来判断,我们可以直接使用数值本身结合js的特性来判断。
if (null) // false
if({存在对象}) // true
if(undefined) //false
if(定义了的变量) // true
if(0)// false
if(除0外的所有数) // true
if("")// false
if(除了空字符串外的所有字符串)// true
if([])// true
多条件与&& || 的使用下,我们也可以先用数值自身判空和双判断条件的断路机制(如果前面的条件成立,就不会判断后面的语句)来避免发生空指针异常的错误。
if( a && b) // 遵照&& 符号判断, a与b存在一个为假的值,全为假
if(a || b ) // 遵照 || 符号判断,a与b存在一个为真,全为真
一般项目中会这样写,来达到判null,判undefined的目的:
if(obj && obj == “test”)
&& 和 || 的特殊特性还可以用来赋值,可以了解一下:
-
switch
前言:switch 语句根据expr表达式 的值,依次与 case 后表达式的值进行比较,如果相等,则执行其后的语句段,只有遇到 break 语句,或者 switch 语句结束才终止;如果不相等,则继续查找下一个 case。switch 语句包含一个可选的 default 语句,如果在前面的 case 中没有找到相等的条件,则执行 default 语句,它与 else 语句类似。
js 的case 判断的是绝对相对===,值和类型都要相等
js中的case可以是任意类型,可以是string类型,number类型,undefined等等,甚至还可以是一个自定义的函数。
switch (expr) { case undefined: alert("undefined"); break; case func: alert("function"); break; case 100: alert("number"); break; case "hello": alert("string"); break; }
2.循环语句
前言:js的循环比较多,可以酌情选择。
效率上:while/do-while的 duff’s device 循环>for>for-of>foreach>for-in。
各自的缺点: while/do-while的 duff’s device 循环采用并行循环的方式,一次执行多次循环,所以耗费资源较多,而且结束语句要另外定义。
for循环需要设置循环的步数,也就是循环的i值。
for-of遍历的是数值的值,对于遍历对象不是很友好,需要借助Objects.keys()方法来遍历。
foreach循环写法比较简洁,但是不能使用break,continue,return进行结束或者跳过循环的操作。
for-in循环比较适合遍历对象,对于遍历数组的值,会将原型变量遍历进去,所以效率最低。
综合情况下,使用for和for-of是最好的。
-
while
var x = 0; var n = 99; while (n > 0) { x = x + n; n = n - 2; } x; // 2500
-
do-while
do-while
和while
循环的唯一区别在于,在每次循环开始的时候判断条件,而不是在每次循环完成的时候判断条件:var n = 0; do { n = n + 1; } while (n < 100); n; // 100
-
for
var x = 0; var i; for (i=1; i<=10000; i++) { x = x + i; } x; // 50005000
-
for-in
var o = { name: 'Jack', age: 20, city: 'Beijing' }; for (var key in o) { console.log(key); // 'name', 'age', 'city' }
-
for-of
var arr = ['a', 'b', 'c', 'd']; for (let a of arr) { console.log(a); // a b c d }
-
foreach
var arr = ['a', 'b', 'c', 'd']; arr.foreach(item => console.log(item) // a b c d)