2.7 控制语句
结构化程序设计中的控制语句有三种,即顺序、分支和循环语句,而且只能用这三种结构来完成程序。JavaScript程序通过控制语句来执行程序流,完成一定的任务。程序流是由若干个语句组成的,语句可以是单一的一条语句,也可以是用大括号{}括起来的多条语句。JavaScript中的控制语句有以下几类:
□分支语句:if-else、switch。
□循环语句:while、do-while、for。
□与程序转移有关的跳转语句:break、continue、return。
2.7.1 分支语句
分支语句提供了一种控制机制,使得程序具有了“判断能力”,能够像人类的大脑一样分析问题。分支语句又称为条件语句,条件语句使部分程序可根据某些表达式的值有选择地执行。
1.条件语句if-else
由if语句引导的选择结构有if结构、if-else结构和else-if结构。
如果条件表达式为true就执行语句组,否则就执行if结构后面的语句。语句组是单句时大括号可以省略。语法结构如下:
// if结构 if(条件表达式) { 语句组; } // if-else结构 if(条件表达式) { 语句组1; } else { 语句组2 } // if-else结构 if(条件表达式1) 语句组1; else if(条件表达式2) 语句组2; else if(条件表达式3) 语句组3; … else if(条件表达式n) 语句组n; else 语句组n+1;
条件语句if-else示例代码如下:
var score = 95; console.log('------ if结构示例-------'); if (score >= 85) { console.log("您真优秀!"); } if (score < 60) { console.log("您需要加倍努力!"); } if (score >= 60 && score < 85) { console.log("您的成绩还可以,仍需继续努力!"); } console.log('------ if…else结构示例------'); if (score < 60) { console.log("不及格"); } else { console.log("及格"); } console.log('------elseif结构示例------'); var testscore = 76; var grade; if (testscore >= 90) { grade = 'A'; } else if (testscore >= 80) { grade = 'B'; } else if (testscore >= 70) { grade = 'C'; } else if (testscore >= 60) { grade = 'D'; } else { grade = 'F'; } console.log("Grade = " + grade);
运行结果如下:
------ if结构示例------- 您真优秀! ------ if…else结构示例------ 及格 ------elseif结构示例------ Grade = C
2.多分支语句switch
switch语句也称开关语句,它引导的选择结构也是一种多分支结构。具体内容如下:
switch(条件表达式){ case 判断值1:语句组1 case 判断值2:语句组2 case 判断值3:语句组3 … case 判断值n:语句组n default:语句组n+1 }
当程序执行到switch语句时,先计算条件表达式的值,假设值为A,然后拿A与第1个case语句中的判断值相比,如果相同则执行语句组1,否则拿A与第2个case语句中的判断值相比,如果相同则执行语句组2,以此类推,直到执行语句组n。如果所有的case语句都没有执行,就执行default的语句组n+1,这时才跳出switch引导的选择结构。
使用switch语句需要注意如下问题:
□case子句中的值必须是常量,而且所有case子句中的值应是不同的。
□default子句是可选的。
□break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行(在一些特殊情况下,多个不同的case值要执行一组相同的操作,这时可以不用break)。
示例代码如下:
var date = new Date(); var month = date.getMonth(); switch (month) { case 0: console.log("January"); break; case 1: console.log("February"); break; case 2: console.log("March"); break; case 3: console.log("April"); break; case 4: console.log("May"); break; case 5: console.log("June"); break; case 6: console.log("July"); break; case 7: console.log("August"); break; case 8: console.log("September"); break; case 9: console.log("October"); break; case 10: console.log("November"); break; case 11: console.log("December"); break; default: console.log("Invalid month."); }
如果当前的月份是7月,则程序的运行结果为:July。但是,如果case 7没有break语句,我们的程序又是什么结果呢?结果会是输出:
July August
这是由于没有break,程序会继续运行下去,而不管有没有case语句,直到遇到一个break语句才跳出switch语句。
2.7.2 循环语句
循环语句使语句或代码块得以重复进行。JavaScript支持三种循环构造类型:for、while和do-while,for和while循环是在执行循环体之前测试循环条件,而do-while是在执行完循环体之后测试循环条件。这就意味着for和while循环可能连一次循环体都未执行,而do-while将至少执行一次循环体。跳转语句主要有continue语句和break语句。
1.while语句
while语句是一种先判断的循环结构,语句格式如下:
[initialization] while (termination){ body; [iteration;] }
其中,中括号部分可以省略。
下面的程序代码是通过while实现查找平方小于100000的最大整数:
var i = 0; while (i * i < 100000) { i++; } console.log(i+""+i*i);
输出结果:317 100489
这段程序的目的是找到平方数小于100000的最大整数。使用while循环需要注意几点:while循环语句中只能写一个表示式,而且是一个布尔型表达式,那么如果循环体中需要循环变量,就必须在while语句之前做好处置的处理,如上例中先给i赋值为0,其次在循环体内部,必须通过语句更改循环变量的值。否则将会发生死循环。
2.do-while语句
do-while语句的使用与while语句的使用相似,不过do-while语句是事后判断的循环结构,语句格式如下:
[initialization] do { body; [iteration;] } while (termination);
下面程序代码是使用do-while实现了查找平方小于100000的最大整数:
var i = 0; do{ i++; } while (i * i 100000) console.log(i + " " + i * i);
输出结果:317 100489
当程序执行到do-while语句时,首先无条件执行一次循环体,然后计算条件表达式,它的值必须是布尔型,如果值为true,则再次执行循环体,然后到条件表达式准备再次判断,如此反复,直到条件表达式的值为false时跳出do-while循环。
3.for语句
for语是应用最为广泛的一种循环语句,也是功能最强的一种,使用格式如下:
for (初始化; 终止; 迭代){ body; }
当程序执行到for语句时,先执行初始化语句,它的作用是初始化循环变量和其他变量,如果它含有多个语句就用逗号隔开。然后,程序计算循环终止语句的值,终止语句的值必须是个布尔值,所以可以用逻辑运算符组合成复杂的判断表达式,如果它的值为true,程序继续执行循环体,执行完成循环体后计算迭代语句,之后返回到终止语句准备再次进行判断,如此反复,直到终止语句的值为false时跳出循环。如果表达式的值为false,则直接跳出for循环。终止语句一般用来改变循环条件的,它可对循环变量和其他变量进行操作,它和初始化语句一样也可由多个语句,并以逗号相隔。
下面程序代码是使用for循环实现平方表:
var i; console.log("n n*n"); console.log("---------"); for (i = 1; i < 10; i++) { console.log(i + " " + i * i); }
运行结果:
n n*n --------- 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81
这个程序的循环部分初始时给循环变量i赋值为1,每次循环实现判断i的值是否小于10,如果是就执行循环体,然后给i加1,因此,最后的结果是打印出从1~9每个数的平方。
for语句执行时,首先执行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。完成一次循环后,重新判断终止条件。
初始化、终止以及迭代部分都可以为空语句(但分号不能省略),三者均为空的时候,相当于一个无限循环。
空的for语句示例:
for(; ;) { …… }
在初始化部分和迭代部分可以使用逗号语句,来进行多个操作。逗号语句是用逗号分隔的语句序列。程序代码如下所示:
for (i = 0, j = 10; i < j; i++, j--) { …… }
循环语句与条件语句一样,如果循环体中只有一条语句,可以省略大括号;但是从程序的可读性角度,不要省略。
4.for-in语句
for-in语句可以帮助我们方便地遍历数组或集合对象。一般格式如下:
for (循环变量 in 数组或集合对象) { …… }
下面的程序代码是使用for语句示例:
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (var i = 0; i < numbers.length; i++) { console.log("Count is: " + numbers[i]); }
下面的程序代码是使用for-in语句示例:
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (var item in numbers) { console.log("Count is: " +numbers[item]); }
从上例的对比中可以发现,item是循环变量,而不是集合中的元素,in后面是数组或集合对象。for-in语句在遍历集合的时候要简单方便得多。
2.7.3 跳转语句
跳转语句有三种:break语句、continue语句和return返回语句。
1.break语句
break语句可用于switch引导的分支结构及以上三种循环结构,它的作用是强行退出循环结构,不执行循环结构中剩余的语句。break语句可分为带标签和不带标签两种格式。
break语句格式如下:
break; //不带标签 break label; //带标签,label是标签名
标签是后面跟一个冒号的标识符。不带标签的break语句使持续跳出它所在那一层的循环结构,而带标签的break语句使持续跳出标签指示的循环结构。
找到元素12在第1行,第0列。在上例中程序第22行可以使循环跳转到第18行的外循环。如果break语句没有标签,则跳出本循环。
不带标签的break语句示例:
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; for (var i = 0; i < numbers.length; i++) { if (i == 3) { break; } console.log("Count is: " + i); }
在上例中,当条件i==3的时候执行break语句,程序运行结果是:
Count is: 0 Count is: 1 Count is: 2
当循环遇到break语句的时候,就会终止循环。
带标签的break语句示例:
var arrayOfInts = [ [ 32, 87, 3, 589], [ 12, 1076, 2000, 8 ], [622, 127, 77, 955] ]; var searchfor = 12; var i, j = 0; var foundIt = false; search: for (i = 0; i < arrayOfInts.length; i++) { for (j = 0; j < arrayOfInts[i].length; j++) { if (arrayOfInts[i][j] == searchfor) { foundIt = true; break search; } } } if (foundIt) { console.log("找到元素 " + searchfor + " 在第" + i + "行, 第" + j + "列"); } else { console.log(searchfor + "在数组中没有找到!"); }
程序运行结果是:
找到元素12在第1行,第0列
2.continue语句
continue语句用来结束本次循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。对于for语句,在进行终止条件的判断前,还要先执行迭代语句。
continue语句格式如下:
continue; //不带标签 continue label; //带标签,label是标签名
不带标签的continue语句示例:
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; for (var i = 0; i < numbers.length; i++) { if (i == 3) { continue; } console.log("Count is: " + i); }
在上例中,当条件i==3的时候执行continue语句,程序运行结果是:
Count is: 0 Count is: 1 Count is: 2 Count is: 4 Count is: 5 Count is: 6 Count is: 7 Count is: 8 Count is: 9
当循环遇到continue语句的时候,终止本次循环,在循环体中continue之后的语句将不再执行,接着进行下次循环,所以输出结果中没有3。
带标签的continue语句示例:
var n = 0; outer: for (var i = 101; i 200; i++) { // 外层循环 for (var j = 2; j < i; j++) { // 内层循环 if (i % j == 0) { continue outer; ① } } console.log("i= " + i); }
在上例中,程序运行结果是:
i= 101 i= 103 …… i= 199
素数就是一个只能被1和自身整除的数,上述代码第①行的作用就是这个数如果能够被非1和非自身整除,就终止本次循环。这里的continue语句不能使用换成break语句,因为如果是break语句,程序第一次满足条件进入if语句时会终止外循环,程序不会再循环了,只有使用continue语句才可以满足需要。
3.return返回语句
return语句可以从当前函数中退出,返回到调用该函数的语句处。返回语句有两种格式:
return expression ; return;