流程控制
JavaScript支持的流程控制也很丰富,JavaScript支持基本的分支语句,如if、if ...else等;也支持基本的循环语句,如while、for等;还支持for in循环等;循环相关的break、continue,以及带标签的break、continue语句也是支持的。
分支
分支语句主要有if语句和switch语句。其中if语句有如下3种形式。
第一种形式:
if(expression)
{
statements
}
第二种形式:
if(expression)
{
statements
}
else
{
statements
}
第三种形式:
if(expression)
{
statements
}
else if(expression)
{
statements
}
...
else
{
statements
}
通常,不要省略if、else、else if后执行块的花括号,但如果语句执行块只有一行语句时,则可以省略花括号。
switch语句的语法格式如下:
switch (expression)
{
case condition 1: statements;
break;
case condition 2: statements;
break;
...
case condition n: statements;
break;
default: statements;
}
这种分支语句的执行是先对expression求值,然后依次匹配condition1、condition2、condition3等条件,遇到匹配的条件即执行对应的执行体;如果前面的条件都没有正常匹配,则执行default后的执行体。
与Java的switch语句完全类似,JavaScript的switch语句中也可省略case块后的break语句,如果省略了case块后的break语句,JavaScript将直接执行后面case块里的代码,不会理会case块里的条件,直到遇到break语句为止。
while循环
while循环的语法格式如下:
while(expression)
{
statements
}
当循环体只有一行语句时,循环体的花括号可以省略。while循环的作用是:先判断expression逻辑表达式的值,当expression为true时,执行循环体;当expression为false时,则结束循环。值得注意的是,一定要让expression有为false的时候,否则循环将成为死循环,永远无法结束循环。
do while循环
do while循环与while循环的区别在于:while循环是先判断循环条件,只有条件为真才执行循环体;而do while循环则先执行循环体,然后判断循环条件,如果循环条件为真,则执行下一次循环,否则中止循环。do while循环的语法格式如下:
do
{
statements
}
while (expression);
与while循环类似的是,如果循环体只有一行语句,则循环体的花括号可以省略,与while循环的区别在于:while循环的循环体可能得不到执行,但do while的循环体至少执行一次。
for循环
for循环是更加简洁的循环语句,大部分情况下,for循环可以代替while循环、do while循环。for循环的基本语法格式如下:
for(initialization; condition; iteration)
{
statements
}
与前面循环类似的是,如果循环体只有一行语句,则循环体的花括号可以省略。for后面的括号里面只有两个分号是必需的,其他都是可以省略的。for后的括号里面以两个分号隔开了三个语句,其中第一个语句是循环的初始化语句,每个循环语句只会执行一次,而且完全可以省略,因为初始化语句可以放在循环语句之前完成;第二个语句是一个逻辑表达式,用于判断是否执行下一次循环。因此,在通常情况下,第二个语句都是不可省略的,如果省略该循环条件,则循环条件一直为true,也就变成了死循环;第三个语句是循环体执行完后最后执行的语句,这个语句也完全可以放在循环体的最后执行。
for in循环
for in循环的本质是一种foreach循环,它主要有两个作用:
➢ 遍历数组里的所有数组元素。
➢ 遍历JavaScript对象的所有属性。
for in循环的语法格式如下:
for(index in object)
{
statements
}
与前面类似的是,如果循环体只有一行代码,则可以省略循环体的花括号。
当遍历数组时,for in循环的循环计数器是数组元素的索引值。除此之外,for in循环还可遍历对象的所有属性。此时,循环计数器是该对象的属性名。
例子
<script type="text/javascript">
// 在页面输出静态文本
document.write("<h1>Navigator对象的全部属性如下:</h1>");
// 遍历navigator对象的所有属性
for (propName in navigator)
{
// 输出navigator对象的所有属性名,以及对应的属性值
document.write('属性' + propName + '的值是:' + navigator[propName]);
document.write("<br />");
}
</script>
break和continue
break和continue都可用于中止循环,区别是continue只是中止本次循环,接着开始下一次循环(我们也可以视continue为忽略本次循环后面的执行语句);而break则是完全中止整个循环,开始执行循环后面的代码。
如果在break或continue后使用标签,则可以直接跳到标签所在的循环。至于使用break和continue的区别与前面类似,break是完全中止标签所在的循环,而continue则是中止标签所在的本次循环。所谓标签,就是在一个合法的标识符后紧跟一个英文冒号(:),标签只有放在循环之前才有效,标签放在其他地方将没有意义。
例子
<script type="text/javascript">
// 使用outer标签表明外部循环
outer:
for (var i = 0 ; i < 5 ; i++)
{
for (var j = 0 ; j < 5 ; j++)
{
document.writeln('j的值为:' + j);
// 当j >= 2时,使用break跳出outer循环。
if (j >= 2) break outer;
document.writeln('i的值为:' + i);
document.writeln('<br />');
}
}
</script>
当j = 2时,使用break完全中止循环,break后还有outer标签,这将完全中止outer标签对应的循环。即当j = 2时,仅执行了document.writeln('j的值为:' + j)代码,两层循环完全结束。
注:本博客内容节选自李刚编著的疯狂HTML 5/CSS 3/JavaScript讲义 ,详细内容请参阅书籍。