Cocos2d-x学习笔记:完全掌握JS API与游戏项目开发 (未来书库,触控未来官方教材)
上QQ阅读APP看书,第一时间看更新

2.7 控制语句

结构化程序设计中的控制语句有三种,即顺序、分支和循环语句,而且只能用这三种结构来完成程序。JavaScript程序通过控制语句来执行程序流,完成一定的任务。程序流是由若干个语句组成的,语句可以是单一的一条语句,也可以是用大括号{}括起来的多条语句。JavaScript中的控制语句有以下几类:


□分支语句:if-else、switch。

□循环语句:while、do-while、for。

□与程序转移有关的跳转语句:break、continue、return。


2.7.1 分支语句

分支语句提供了一种控制机制,使得程序具有了“判断能力”,能够像人类的大脑一样分析问题。分支语句又称为条件语句,条件语句使部分程序可根据某些表达式的值有选择地执行。

1.条件语句if-else

由if语句引导的选择结构有if结构、if-else结构和else-if结构。

如果条件表达式为true就执行语句组,否则就执行if结构后面的语句。语句组是单句时大括号可以省略。语法结构如下:

    // if结构
    if(条件表达式) {
    语句组;
    }
    
    // if-else结构
    if(条件表达式) {
    语句组1;
    } else {
    语句组2
    }
    
    // if-else结构
    if(条件表达式1)
    语句组1;
    else if(条件表达式2)
    语句组2;
    else if(条件表达式3)
    语句组3;
    …
    else if(条件表达式n)
    语句组n;
    else
    语句组n+1;

条件语句if-else示例代码如下:

    var score = 95;
    
    console.log('------ if结构示例-------');
    if (score >= 85) {
        console.log("您真优秀!");
    }
    
    if (score < 60) {
        console.log("您需要加倍努力!");
    }
    
    if (score >= 60 && score < 85) {
        console.log("您的成绩还可以,仍需继续努力!");
    }
    
    console.log('------ if…else结构示例------');
    if (score < 60) {
        console.log("不及格");
    } else {
        console.log("及格");
    }
    
    console.log('------elseif结构示例------');
    
    var testscore = 76;
    var grade;
    
    if (testscore >= 90) {
        grade = 'A';
    } else if (testscore >= 80) {
        grade = 'B';
    } else if (testscore >= 70) {
        grade = 'C';
    } else if (testscore >= 60) {
        grade = 'D';
    } else {
        grade = 'F';
    }
    console.log("Grade = " + grade);

运行结果如下:

    ------ if结构示例-------
    您真优秀!
    ------ if…else结构示例------
    及格
    ------elseif结构示例------
    Grade = C

2.多分支语句switch

switch语句也称开关语句,它引导的选择结构也是一种多分支结构。具体内容如下:

    switch(条件表达式){
        case 判断值1:语句组1
        case 判断值2:语句组2
        case 判断值3:语句组3
        …
        case 判断值n:语句组n
        default:语句组n+1
    }

当程序执行到switch语句时,先计算条件表达式的值,假设值为A,然后拿A与第1个case语句中的判断值相比,如果相同则执行语句组1,否则拿A与第2个case语句中的判断值相比,如果相同则执行语句组2,以此类推,直到执行语句组n。如果所有的case语句都没有执行,就执行default的语句组n+1,这时才跳出switch引导的选择结构。

使用switch语句需要注意如下问题:


□case子句中的值必须是常量,而且所有case子句中的值应是不同的。

□default子句是可选的。

□break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行(在一些特殊情况下,多个不同的case值要执行一组相同的操作,这时可以不用break)。


示例代码如下:

    var date = new Date();
    var month = date.getMonth();
    
    switch (month) {
        case 0:
            console.log("January");
            break;
        case 1:
            console.log("February");
            break;
        case 2:
            console.log("March");
            break;
        case 3:
            console.log("April");
            break;
        case 4:
            console.log("May");
            break;
        case 5:
            console.log("June");
            break;
        case 6:
            console.log("July");
            break;
        case 7:
            console.log("August");
            break;
        case 8:
            console.log("September");
            break;
        case 9:
            console.log("October");
            break;
        case 10:
            console.log("November");
            break;
        case 11:
            console.log("December");
            break;
        default:
            console.log("Invalid month.");
    }

如果当前的月份是7月,则程序的运行结果为:July。但是,如果case 7没有break语句,我们的程序又是什么结果呢?结果会是输出:

    July
    August

这是由于没有break,程序会继续运行下去,而不管有没有case语句,直到遇到一个break语句才跳出switch语句。

2.7.2 循环语句

循环语句使语句或代码块得以重复进行。JavaScript支持三种循环构造类型:for、while和do-while,for和while循环是在执行循环体之前测试循环条件,而do-while是在执行完循环体之后测试循环条件。这就意味着for和while循环可能连一次循环体都未执行,而do-while将至少执行一次循环体。跳转语句主要有continue语句和break语句。

1.while语句

while语句是一种先判断的循环结构,语句格式如下:

    [initialization]
    while (termination){
        body;
        [iteration;]
    }

其中,中括号部分可以省略。

下面的程序代码是通过while实现查找平方小于100000的最大整数:

    var i = 0;
    
    while (i * i < 100000) {
        i++;
    }
    console.log(i+""+i*i);

输出结果:317 100489

这段程序的目的是找到平方数小于100000的最大整数。使用while循环需要注意几点:while循环语句中只能写一个表示式,而且是一个布尔型表达式,那么如果循环体中需要循环变量,就必须在while语句之前做好处置的处理,如上例中先给i赋值为0,其次在循环体内部,必须通过语句更改循环变量的值。否则将会发生死循环。

2.do-while语句

do-while语句的使用与while语句的使用相似,不过do-while语句是事后判断的循环结构,语句格式如下:

    [initialization]
    do {
        body;
        [iteration;]
    } while (termination);

下面程序代码是使用do-while实现了查找平方小于100000的最大整数:

    var i = 0;
    do{
        i++;
    } while   (i * i  100000)
    console.log(i + " " + i * i);

输出结果:317 100489

当程序执行到do-while语句时,首先无条件执行一次循环体,然后计算条件表达式,它的值必须是布尔型,如果值为true,则再次执行循环体,然后到条件表达式准备再次判断,如此反复,直到条件表达式的值为false时跳出do-while循环。

3.for语句

for语是应用最为广泛的一种循环语句,也是功能最强的一种,使用格式如下:

    for (初始化; 终止; 迭代){
        body;
    }

当程序执行到for语句时,先执行初始化语句,它的作用是初始化循环变量和其他变量,如果它含有多个语句就用逗号隔开。然后,程序计算循环终止语句的值,终止语句的值必须是个布尔值,所以可以用逻辑运算符组合成复杂的判断表达式,如果它的值为true,程序继续执行循环体,执行完成循环体后计算迭代语句,之后返回到终止语句准备再次进行判断,如此反复,直到终止语句的值为false时跳出循环。如果表达式的值为false,则直接跳出for循环。终止语句一般用来改变循环条件的,它可对循环变量和其他变量进行操作,它和初始化语句一样也可由多个语句,并以逗号相隔。

下面程序代码是使用for循环实现平方表:

    var i;
    console.log("n   n*n");
    console.log("---------");
    for (i = 1; i < 10; i++) {
        console.log(i + " " + i * i);
    }

运行结果:

    n   n*n
    ---------
    1 1
    2 4
    3 9
    4 16
    5 25
    6 36
    7 49
    8 64
    9 81

这个程序的循环部分初始时给循环变量i赋值为1,每次循环实现判断i的值是否小于10,如果是就执行循环体,然后给i加1,因此,最后的结果是打印出从1~9每个数的平方。

for语句执行时,首先执行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。完成一次循环后,重新判断终止条件。

初始化、终止以及迭代部分都可以为空语句(但分号不能省略),三者均为空的时候,相当于一个无限循环。

空的for语句示例:

    for(; ;)  {
        ……
    }

在初始化部分和迭代部分可以使用逗号语句,来进行多个操作。逗号语句是用逗号分隔的语句序列。程序代码如下所示:

    for (i = 0, j = 10; i < j; i++, j--) {
      ……
    }

循环语句与条件语句一样,如果循环体中只有一条语句,可以省略大括号;但是从程序的可读性角度,不要省略。

4.for-in语句

for-in语句可以帮助我们方便地遍历数组或集合对象。一般格式如下:

    for (循环变量 in 数组或集合对象) {
        ……
    }

下面的程序代码是使用for语句示例:

    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    for (var i = 0; i < numbers.length; i++) {
        console.log("Count is: " + numbers[i]);
    }

下面的程序代码是使用for-in语句示例:

    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    for (var item  in numbers) {
        console.log("Count is: " +numbers[item]);
    }

从上例的对比中可以发现,item是循环变量,而不是集合中的元素,in后面是数组或集合对象。for-in语句在遍历集合的时候要简单方便得多。

2.7.3 跳转语句

跳转语句有三种:break语句、continue语句和return返回语句。

1.break语句

break语句可用于switch引导的分支结构及以上三种循环结构,它的作用是强行退出循环结构,不执行循环结构中剩余的语句。break语句可分为带标签和不带标签两种格式。

break语句格式如下:

    break;       //不带标签
    break label; //带标签,label是标签名

标签是后面跟一个冒号的标识符。不带标签的break语句使持续跳出它所在那一层的循环结构,而带标签的break语句使持续跳出标签指示的循环结构。

找到元素12在第1行,第0列。在上例中程序第22行可以使循环跳转到第18行的外循环。如果break语句没有标签,则跳出本循环。

不带标签的break语句示例:

    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
    for (var i = 0; i < numbers.length; i++) {
        if (i == 3) {
            break;
        }
        console.log("Count is: " + i);
    }

在上例中,当条件i==3的时候执行break语句,程序运行结果是:

    Count is: 0
    Count is: 1
    Count is: 2

当循环遇到break语句的时候,就会终止循环。

带标签的break语句示例:

    var arrayOfInts = [
        [ 32, 87, 3, 589],
        [ 12, 1076, 2000, 8 ],
        [622, 127, 77, 955]
    ];
    
    var searchfor = 12;
    var i, j = 0;
    var foundIt = false;
    
    search: for (i = 0; i < arrayOfInts.length; i++) {
        for (j = 0; j < arrayOfInts[i].length; j++) {
            if (arrayOfInts[i][j] == searchfor) {
                foundIt = true;
                break search;
            }
        }
    }
    
    if (foundIt) {
        console.log("找到元素 " + searchfor + " 在第" + i + "行, 第" + j + "列");
    } else {
        console.log(searchfor + "在数组中没有找到!");
    }

程序运行结果是:

    找到元素12在第1行,第0列

2.continue语句

continue语句用来结束本次循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。对于for语句,在进行终止条件的判断前,还要先执行迭代语句。

continue语句格式如下:

    continue;       //不带标签
    continue label; //带标签,label是标签名

不带标签的continue语句示例:

    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
    for (var i = 0; i < numbers.length; i++) {
        if (i == 3) {
            continue;
        }
        console.log("Count is: " + i);
    }

在上例中,当条件i==3的时候执行continue语句,程序运行结果是:

    Count is: 0
    Count is: 1
    Count is: 2
    Count is: 4
    Count is: 5
    Count is: 6
    Count is: 7
    Count is: 8
    Count is: 9

当循环遇到continue语句的时候,终止本次循环,在循环体中continue之后的语句将不再执行,接着进行下次循环,所以输出结果中没有3。

带标签的continue语句示例:

    var n = 0;
    outer: for (var i = 101; i  200; i++) {           // 外层循环
        for (var j = 2; j < i; j++) {                     // 内层循环
            if (i % j == 0) {
                continue outer;                                                 ①
            }
        }
        console.log("i= " + i);
    }

在上例中,程序运行结果是:

    i= 101
    i= 103
    ……
    i= 199

素数就是一个只能被1和自身整除的数,上述代码第①行的作用就是这个数如果能够被非1和非自身整除,就终止本次循环。这里的continue语句不能使用换成break语句,因为如果是break语句,程序第一次满足条件进入if语句时会终止外循环,程序不会再循环了,只有使用continue语句才可以满足需要。

3.return返回语句

return语句可以从当前函数中退出,返回到调用该函数的语句处。返回语句有两种格式:

    return expression ;
    return;