6.语句:ECMA-262 规定了一组语句(也称为流控制语句)。从本质上看,语句定义了ECMAScript 中的主要语法,语句通常使用一或多个关键字来完成给定任务。例如通知函数退出;例如指定重复执行某个命令的次数。
if语句:根据条件进行选择
//if (condition) statement1 else statement2;
//其中的condition(条件)可以是任意表达式;而且对这个表达式求值的结果不一定是布尔值。
//ECMAScript 会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值。
//如果对condition求值的结果是true,则执行statement1(语句1)
//如果对condition 求值的结果是false,则执行statement2(语句2)。
//而且这两个语句既可以是一行代码,也可以是一个代码块(以一对花括号括起来的多行代码)。
if (i > 25){
alert("Greater than 25."); // 单行语句
}
else {
alert("Less than or equal to 25."); // 代码块中的语句
}
do-while语句:是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。换句话说,在对条件表达式求值之前,循环体内的代码至少会被执行一次。
do {
statement
} while (expression);
//下面是一个示例:
var i = 0;
do {
i += 2;
} while (i < 10);
alert(i);
while语句:属于前测试循环语句,也就是说,在循环体内的代码被执行之前,就会对出口条件求值。因此,循环体内的代码有可能永远不会被执行。
while(expression) statement
//下面是一个示例:
var i = 0;
while (i < 10) {
i += 2;
}
for语句:for 语句也是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。
for (initialization; expression; post-loop-expression) statement
//下面是一个示例:
var count = 10;
for (var i = 0; i < count; i++){
alert(i);
}
//以上代码定义了变量i 的初始值为0。
//只有当条件表达式i<count返回true 的情况下才会进入for循环,因此也有可能不会执行循环体中的代码。
//如果执行了循环体中的代码,则一定会对循环后的表达式(i++)求值,即递增i 的值。
//这个for 循环语句与下面的while 语句的功能相同:
var count = 10;
var i = 0;
while (i < count){
alert(i);
i++;
}
//使用while 循环做不到的,使用for 循环同样也做不到。
也就是说,for 循环只是把与循环有关的代码集中在了一个位置。
//在for循环的变量初始化表达式中,也可以不使用var关键字。该变量的初始化可以在外部执行。
var count = 10;
var i;
for (i = 0; i < count; i++){
alert(i);
}
//由于ECMAScript 中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到。
var count = 10;
for (var i = 0; i < count; i++){
alert(i);
}
alert(i); //10
//此外,for 语句中的初始化表达式、控制表达式和循环后表达式都是可选的。
//将这三个表达式全部省略,就会创建一个无限循环
for (;;) { // 无限循环
doSomething();
}
//而只给出控制表达式实际上就把for 循环转换成了while 循环,例如:
var count = 10;
var i = 0;
for (; i < count; ){
alert(i);
i++;
}
for-in语句:是一种精准的迭代语句,可以用来枚举对象的属性。
for (property in expression) statement
//下面是一个示例:
for (var propName in window) {
document.write(propName);
}
//在这个例子中,我们使用for-in 循环来显示了BOM 中window 对象的所有属性。
//每次执行循环时,都会将window 对象中存在的一个属性名赋值给变量propName。
//这个过程会一直持续到对象中的所有属性都被枚举一遍为止。
//与for 语句类似,这里控制语句中的var 操作符也不是必需的。
//但是,为了保证使用局部变量,我们推荐上面例子中的这种做法。
//但是,如果表示要迭代的对象的变量值为null 或undefined,for-in 语句会抛出错误。
//ECMAScript 5 更正了这一行为;对这种情况不再抛出错误,而只是不执行循环体。
//为了保证最大限度的兼容性,建议在使用for-in 循环之前,先检测确认该对象的值不是null 或undefined。
label语句:使用label 语句可以在代码中添加标签,以便将来使用。
label: statement
//下面是一个示例:
start: for (var i=0; i < count; i++) {
alert(i);
}
//这个例子中定义的start 标签可以在将来由break 或continue 语句引用。
//加标签的语句一般都要与for 语句等循环语句配合使用。
break和continue语句:break 和continue 语句用于在循环中精确地控制代码的执行。其中,break 语句会立即退出循环,
强制继续执行循环后面的语句。而continue 语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行,只是跳过这次循环。
var num = 0;
for (var i=1; i < 10; i++) {
if (i % 5 == 0) {
break;
}
num++;
}
alert(num); //4
var num = 0;
for (var i=1; i < 10; i++) {
if (i % 5 == 0) {
continue;
}
num++;
}
alert(num); //8
outermost:
for (var i=0; i < 10; i++) {
for (var j=0; j < 10; j++) {
if (i == 5 && j == 5) {
break outermost;
}
num++;
}
}
alert(num); //55
var num = 0;
outermost:
for (var i=0; i < 10; i++) {
for (var j=0; j < 10; j++) {
if (i == 5 && j == 5) {
continue outermost;
}
num++;
}
}
alert(num); //95
with语句:with 语句的作用是将代码的作用域设置到一个特定的对象中。
//定义with 语句的目的主要是为了简化多次编写同一个对象的工作,如下面的例子所示:
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
//上面几行代码都包含location 对象。如果使用with 语句,可以把上面的代码改写成如下所示:
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
//在这个重写后的例子中,使用with 语句关联了location 对象。
//这意味着在with语句的代码块内部,每个变量首先被认为是一个局部变量,
//而如果在局部环境中找不到该变量的定义,就会查询location 对象中是否有同名的属性。
//如果发现了同名属性,则以location 对象属性的值作为变量的值。
//严格模式下不允许使用with 语句,否则将视为语法错误。
switch语句:switch 语句与if 语句的关系最为密切,而且也是在其他语言中普遍使用的一种流控制语句。
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
//switch 语句中的每一种情形(case)的含义是:“如果表达式等于这个值(value),
//则执行后面的语句(statement)”。而break 关键字会导致代码执行流跳出switch 语句。
//如果省略break 关键字,就会导致执行完当前case 后,继续执行下一个case。
//最后的default 关键字则用于在表达式不匹配前面任何一种情形的时候,执行代码。
//从根本上讲,switch 语句就是为了让开发人员免于编写像下面这样的代码:
if (i == 25){
alert("25");
} else if (i == 35) {
alert("35");
} else if (i == 45) {
alert("45");
} else {
alert("Other");
}
//而与此等价的switch 语句如下所示:
switch (i) {
case 25:
alert("25");
break;
case 35:
alert("35");
break;
case 45:
alert("45");
break;
default:
alert("Other");
}
//通过为每个case 后面都添加一个break 语句,就可以避免同时执行多个case 代码的情况。
//假如确实需要混合几种情形,不要忘了在代码中添加注释,说明你是有意省略了break 关键字,
switch (i) {
case 25:
/* 合并两种情形 */
case 35:
alert("25 or 35");
break;
case 45:
alert("45");
break;
default:
alert("Other");
}
//虽然ECMAScript 中的switch 语句借鉴自其他语言,但这个语句也有自己的特色。
//首先,可以在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.");
}