1.语句
1.1 if语句
if语句的语法格式为:if(condition) statement1 else statement2
condition可以是任何表达式,而且对这个值的求值结果不一定是布尔值,ECMAScript会调用Boolean()转换函数将表达式的结果转换成一个布尔值。如果该值为true,执行statement1;如果该值为false,则执行statment2。statement1和statement2可以是一行代码,也可以是代码块,但我们经常用的是代码块,可以避免不必要的误解。下面看一个例子:
if(i>25)
alert("大于25"); //单行语句
else{
alert("小于25"); //代码块中的代码
}
虽然可以把整个if语句写在一行,但是为了阅读方便,一般不建议这样做。
1.2 do…while语句
do…while语句是一种后测试循环语句,即执行完一次循环体才进入出口判断条件,也就是说,do..while语句的循环体至少被执行一次,这也是它和while的区别。语法格式为:
do{
statement
}while(expression);
1.3 while语句
while语句是一种前测试语句,在执行循环体之前,就要对出口条件进行求值,如果求值的结果为false,那么循环体的内容将不会被执行,语法格式为:
while(expression) statament
1.4 for语句
for语句也是一种前测试循环语句,但是它具有在循环之前初始化变量和定义循环后要执行的代码的能力。使用for语句可以实现while语句相同的功能。使用while循环做不到的功能,for循环同样做不到。需要 注意的是,for语句的初始化表达式、控制表达式和循环后表达式都是可选的,将这些表达式都省略的话,则是一个无限循环。如果只是给出控制表达式的话,实际上就是把for循环转换成了while循环。
1.5 for-in语句
for-in语句是一种精准的迭代语句,可以用来枚举对象的属性,语法格式为:for(property in expression) statement
下面看一个例子:
<script>
for(var propertyName in window)
{
document.write(propertyName+"<br>");
}
</script>
上述的例子就是枚举BOM中window对象的所有属性。ECMAScript对象的属性没有顺序,每次遍历输出的结果顺序可能不同。在ECMAScript5之前,如果需要迭代的对象的变量值为null或者undefined,for-in语句会抛出错误,而ECMAScirpt5更正了这个行为,对这种情况不再抛出错误而是不继续执行循环体。为了保证最大程度的兼容性,在for-in循环之前,需要检测确认该对象的值不是null或者undefined。
1.6 label语句
使用label语句可以在代码中添加标签,以便在将来使用,语法为:label:statement
<script>
var count=10;
start:for(var i=0;i<count;i++)
{
alert(i);
}
</script>
上述例子定义的start标签可以在将来由break或者continue语句引用。加标签的语句一般都是要与for语句等循环语句配合使用。
1.7 break语句和continue语句
break语句和continue语句都是用来精准控制代码的执行的。break语句是跳出整个循环,而break语句则是跳出当前循环。通过一个例子来看一下两者的效果:
<script>
var num1=0;
var num2=0;
for(var i=1;i<10;i++) {
if (i % 5 == 0) break;
num1++;
}
for(var i=1;i<10;i++)
{
if(i%5==0) continue;
num2++;
}
alert("使用break循环了:"+num1+",使用continue循环了:"+num2);
</script>
前面说到label语句可以和continue、break语句联合使用,从而返回代码中特定的位置,这种使用的情况多半是循环嵌套的情况。我们 常见的就是for循环的嵌套,当使用了label语句的时候,在嵌套的循环内部使用break语句,不仅能退出嵌套的循环还能退出外层的循环。在使用label语句下,continue是会退出嵌套的循环而执行外层的循环。需要注意的是,这里的break和continue语句后面都要加上一个参数:要返回到的标签。
下面看一个简单的例子:
<script>
var num1=0;
var num2=0;
testLabel1:for(var i=0;i<10;i++)
{
for(var j=0;j<10;j++)
{
if(i==5 && j==5)
{
break testLabel1;
}
num1++;
}
}
testLabel2:for(var i=0;i<10;i++)
{
for(var j=0;j<10;j++)
{
if(i==5 && j==5)
{
continue testLabel2;
}
num2++;
}
}
alert("使用break执行了:"+num1+",使用continue执行了:"+num2);
</script>
可以看到,break执行了55次,而continue执行了95次。
建议在使用label语句,一定要使用描述性的标签,同时循环嵌套不要过度,这样可以给测试带来不必要的麻烦。