5. 语句
5.1 if语句
大多数编程语言中最为常用的语句就是if语句。以下是if语句的用法:
if(condition) statement1 else statement2;
其中的condition可以是任意表达式,而且对这个表达式求值的结果不一定是布尔值。ECMAScript会自动调用Boolean()函数将这个表达式的值转换为布尔值。如果对condition求值的结果为true,则执行statement1;如果对conditon求值的结果为false,则执行statment2。而且这两个语句既可以是一行代码,也可以是一个代码块(以一个花括号括起来的多行代码)。请看下面的例子:
if (i>25){
alert("Greater than 25");
}else{
alert("Less than or equal to 25");
}
不过,我们推荐始终使用代码块,即使要执行的代码只有一行。
5.2 do-while语句
do-while语句是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。下面是一个例子:
var i = 0;
do {
i+=2;
}while (i<10);
alert(i);
5.3 while语句
while语句时前测试循环语句,也就是说,在循环体内的代码执行之前,就会对出口条件求值。下面是一个例子:
var i = 0;
while (i<10){
i+=2;
}
alert(i);
5.4 for语句
for语句也是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。下面是一个例子:
var count = 10;
for (var i=0; i<10; i++ ){
alert(i);
}
有必要指出的是,在for循环的变量初始化表达式中,也可以不使用var关键字。该变量的初始化可以放在外部执行, 例如:
var count = 10;
var i;
for (i=0; i< count; i++){
alert(i);
}
以上代码与在循环初始化语句表达式中声明变量的效果是一样的。由于ECMAScript中不存在块级作用域,因此在循环内部定义的变量在外部也可以访问到。例如:
var count = 10;
for (var i=0; i<10; i++ ){
alert(i);
}
alert(i); //10
此外,在for语句中,初始化表达式,控制表达式和循环后表达式都是可选的。将这三个表达式都省略,就可以创建一个无限循环。例如:
for (;;){
alert("endless...");
}
而只给出控制表达式实际上就把for循环转换成了while循环。例如:
var count = 10;
var i = 0;
for (; i < count; ){
alert(i);
i++;
}
由于for语句具有极强的灵活性,因此它也是ECMAScript中最常用的一个语句。
5.5 for-in语句
for-in语句是一种精准的迭代语句,可以用来枚举对象的属性。下面是一个例子:
for (var propName in window){
document.write(propName);
}
ECMAScript对象的属性没有顺序。因此,通过for-in语句循环输出的属性名顺序是不可预测的。但是,如果要迭代的对象变量值为null或undefined,for-in循环语句会抛出错误。ECMAScript5更正了这样一行为,对这种情况不再抛出错误,而只是不执行循环体。但为了保证最大限度的兼容性,建议在使用for-in循环之前,先检测该值
是否是null或undefined。
5.6 switch语句
switch语句与if语句的关系最为密切,ECMAScript中的switch语句与C语言非常接近。下面是一个例子:
switch(i) {
case 25:
alert("25");
break;
case 35:
alert("35");
break;
default:
alert("other");
}
switch语句中可以使用任何数据类型,并且每个case的值不一定是常量,可以是变量,甚至是表达式。请看下面的例子:
switch("hello world") {
case "hello" + "world":
alert("Greeting was found");
break;
case "goodbye":
alert("Closing was found");
break;
default:
alert("Unexpected message was found");
}
另一个例子:
var num = 25;
switch(true) {
case num < 0:
alert("Less than 0");
break;
case num >= 0 && num <= 10:
alert("Between 0 and 10");
break;
default:
alert("More than 10");
}
switch语句在比较值时使用的是全等操作符,因此不会发生类型转换(字符串"10"不等于数值10)。