
3.5 语句
语句就是JavaScript指令,通过这些指令可以设计程序的逻辑执行顺序。
提示:JavaScript定义了很多语句,具体分类和说明请扫码阅读。
3.5.1 表达式语句和语句块
如果在表达式的尾部附加一个分号,它就会形成一个表达式语句。JavaScript默认独立成行的表达式也是表达式语句,解析时自动补加分号。表达式语句是最简单、最基本的语句。这种语句一般按着从上到下的顺序依次执行。
【示例】语句块就是由大括号包含的一个或多个语句。在下面的代码段中,第一行是一个表达式语句,第二行到第五行是一个语句块,该语句块中包含两个简单的表达式语句。

3.5.2 条件语句
程序的基本逻辑结构包括3种:顺序、选择和循环。大部分控制语句都属于顺序结构,而条件语句属于选择结构,它主要包括if语句和switch语句。
1.if语句
if语句的基本语法如下。
if (condition) statements
其中,condition是一个表达式,statements是一个句子或段落。当condition表达式的结果不是false且不能够转换为false时,程序就执行statements从句的内容,否则就不执行。
【示例1】下面的条件语句的从句是一个句子。该条件语句先判断指定变量是否被初始化,如果没有被初始化,则新建对象。

【示例2】下面的条件语句的从句是一个段落。该条件语句先判断变量a是否大于变量b,如果大于则交换值。

如下语法形式在if语句的基本形式上还可以扩展,它表示如果condition表达式条件为true,则执行statements1从句,否则执行statements2从句。
if (condition) statements1 else statements2
【示例3】可以按如下方式在示例2的基础上扩展它的表现行为。如果a大于b,则替换它们的值,否则输出提示信息,如图3.5所示。

图3.5 条件语句的应用

2.switch语句
对于多条件的嵌套结构,更简洁的方法是使用switch语句,其语法格式如下。

switch语句首先计算switch关键字后面的表达式,然后按出现的先后顺序计算case后面的表达式,直到找到与switch表达式的值等同(===)的值为止。case表达式通过等同运算来进行判断,表达式匹配的时候不进行类型转换。
如果没有一个case标签与switch后面的表达式匹配,switch语句就开始执行标签为default的语句体。如果没有default标签,switch语句就跳出整个结构体。在默认情况下,default标签通常放在末尾,当然也可以放在switch主体的任意位置。
【示例4】本示例使用prompt()方法获取用户输入的值,然后根据输入的值判断用户是几年级,演示效果如图3.6所示。


图3.6 switch语句的应用
3.5.3 循环语句
循环语句就是能够重复执行相同操作的语句。作为JavaScript的基本结构,循环语句在应用开发中也是经常使用。与if语句一样,循环语句也有两种基本语法形式:while语句和for语句。
1.while语句
while语句的基本语法形式如下:
while (condition) { statements }a
while语句在每次循环开始之前都要计算condition表达式。如果为true,则执行循环体内的语句;如果为false,就跳出循环体,转而执行while语句后面的语句。
【示例1】在下面这个循环语句中,当变量a大于等于10之前,while语句将循环10次输出显示变量a的值,变量a的值在结构体内不断递增。

while语句还有一种特殊的变体,其语法形式如下。
do statement while (condition);
在这种语句体中,首先执行statement语句块一次,每次循环完成之后计算condition条件,并且会在每次条件计算为true的时候重新执行statement语句块。如果condition条件计算为false,会跳转到do/while后面的语句。
【示例2】可将示例1改写为下面的形式。

2.for语句
for语句要比while语句简洁,因此更受用户喜欢,其语法形式如下。
for ([initial-expression;] [condition;] [increment-expression]) { statements }
for语句首先计算初始化表达式(initial-expression),典型情况下用于初始化计数器变量,该表达式可选用var关键字声明新变量。然后在每次执行循环的时候计算该表达式,如果为true,就执行statements中的语句。该条件测试是可选的,如果缺省则条件永远为true。此时,除非在循环体内使用break语句,否则不能终止循环。increment-expression表达式通常用于更新或自增计数器变量。
【示例3】将上面的示例用for语句设计,则代码如下。
for(var i = 0; i < 10; i ++ ){ document.write(i); }
for循环语句也可以引入多个计数器,并在每次循环中改变它们的值。例如:
for(var a = 1, b = 1, c = 1; a + b + c < 100; a ++ , b += 2 , c *= 2 ){ document.write( "a=" + a + ",b=" + b + ",c=" + c + "<br/>"); }
上面的示例引入了3个计数器,并分别在每次循环中改变它们的值,循环的条件是3个计数器的总和小于100,执行效果如图3.7所示。

图3.7 多计数器的循环语句运行效果
3.5.4 跳转语句
跳转语句能够从所在的分支、循环或从函数调用返回的语句跳出。JavaScript的跳转语句包括3种:break语句、continue语句和return语句。
break语句用来退出循环或者switch语句,其语法格式如下。
break;
【示例1】在下面这个示例中设置while语句的循环表达式永远为true(while能够转换数值1为true)。然后在while循环结构体中设置一个if语句,判断当变量i大于50时,程序跳出while循环体。

【示例2】跳转语句也可以与标记结合使用,实现跳转到指定的行,而不是仅仅跳出循环体。在下面的嵌套for循环体内,在外层for语句中定义一个标记x,然后内层for语句使用if语句设置,当a大于5时跳出外层for语句,运行效果如图3.8所示。


图3.8 跳转语句与标记配合使用
continue语句的用法与break语句相似,唯一的区别是continue语句不会退出循环,而是开始新的迭代(即重新执行循环语句)。不管带标记还是不带标记,continue语句只能用在循环语句的循环体中。
return语句用来指定函数的返回值,它只能用在函数或者闭包中,其语法形式如下。
return [expression]
当执行return语句时,程序先计算expression表达式,然后返回表达式的值,并将控制逻辑从函数体内返回。