JavaScript流程控制:顺序结构、分支结构、循环结构

对于JS流程控制,与C语言的流程控制如出一辙。白龙网从顺序结构、分支结构、循环结构三个层面展开复习。顺序结构不用多数,按照先后顺序执行即可。宏观上说,分支结构有if分支、三元运算、switch语句等3种形式,重点是if分支语句,它又细分为单分支、双重分支和多重分支语句。循环语句就比较复杂一些,分别为for循环、while循环、do while循环,其中for循环又细分为单for循环,双重for循环,一般两重循环就能满足大部分需求。
1、顺序结构
按照代码的先后顺序,依次执行。
2、分支结构
根据不同的条件,执行不同的路径的代码,得到不同的结果。不管是单分支语句,还是多分支、多分支语句,执行结果只有一个。另外,else与if之间有一个空格,如果else表示结束,只有if后面可以跟花括号。
(1)if分支类型
①if单分支语句
    <script>
        if (条件表达式) {
            //语句,当条件表达式为真时,执行花括号内语句;当条件表达式为假时,执行if后面的语句
        }
    </script>
    案例:设置条件,只允许18岁以上的成年人可以访问网站。
        <script>
        var age = prompt('请输入您的年龄');
        if (age >= 18) {
            //
            alert('欢迎访问白龙网');
        }
    </script>
②if双分支语句
    <script>
        if (条件表达式) {
            //语句1,当条件表达式为真时,执行花括号内语句1;
        } else {
            //语句2,当条件表达式为假时,执行语句2;需要特别注意的是,else后面只能加花括号,不能加圆括号
        }
    </script>
    案例1:年满18岁,方可上网
        <script>
        var age = prompt('请输入您的年龄');
        if (age >= 18) {
            //
            alert('欢迎访问白龙网');
        } else {
            alert('未满18岁,禁止上网')
        }
    </script>
    案例2:判断闰年、平年
        <script>
        var year = prompt('输入年份,查看闰年、平年');
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            alert('您输入的年份' + year +' 是闰年');
        } else {
            alert('您输入的年份' + year + '是平年');
        }
    </script>
    案例3:中奖有奖,否则无奖
        <script>
        var prize = prompt('请输入中奖者姓名:');
        if (prize == '刘德华') {
            alert('恭喜您,中奖5元');
        } else {
            alert('很遗憾,您没有中奖,继续加油哦');
        }
    </script>
③if多分支语句
    <script>
        if (条件表达式) {
            //语句1,当条件表达式为真时,执行花括号内语句1;
        } else if{
            //语句2,当条件表达式为假时,执行语句2;需要特别注意的是,else后面只能加花括号,不能加圆括号
        } else if {
            //语句3
        } else {
            //语句n,如果上面的条件都不满足,就执行最后一个
        }
    </script>
    案例:根据学生成绩,打印对应评级
        <script>
        var score = prompt('请输入您的分数:');
        if(score > 100) {
            alert('满分100分,请输入有效分数');
        } else if(score >= 90) {
            alert('您的评分是:A');
        } else if(score >=80) {
            alert('您的评分是:B');
        } else if(score >=70) {
            alert('您的评分是:C');
        } else if(score >= 60) {
            alert('您的评分是:D');
        } else if(score >= 0) {
            alert('您的评分是:F');
        } else if(score < 0) {
            alert('请输入0~100之间的分数');
        }
    </script>
(2)三元表达式
三元表达式类似于双重分支语句,他是由三元运算符(?:)组成的式子
    <script>
        var num = 10;
        var result =  num > 6 ? '您说的对' : '不对';
        console.log(result);//您说的对
    </script>
    案例:输入一个0~59之间的数字,如果小于10,就在数字前加个0,否则就正常输出这个数字。
        <script>
        var time = prompt('请输入0~59之间的数字')
        var result = time < 10 ? '0' + time : time;
        alert(result);
    </script>
(3)switch语句
是多分支语句,也是多选一的语句,主要针对变量设置特定值。执行过程中,判断表达式的值是否与case后面的值匹配,如果匹配成功,则执行对应语句;否则就执行默认值。
表达式与CASE的值是全等,即===;baeak不能省略,如果没有break,当前语句不会退出switch,语句会按照顺序全部执行,直到遇到break;
    switch(表达式) {
        case value1: 语句1;break;
        case value2: 语句2;break;
        …………………………………………
        default: 语句;
    }
    案例:表达式3与case3匹配,故而打印3。
    <script>
        var num = prompt('请输入数值:');
        switch(parseInt(num)) {
            case 1: 
                console.log('1');
                break;
            case 2: 
                console.log('2');
                break;
            case 3: 
                console.log('3');
                break;
            default: 
                console.log('没有查询到对应内容');
 
        }
    </script>
    案例:查询水果的价格
        <script>
        var fruit = prompt('请输入水果名称:');
        switch(fruit) {
            case '苹果': 
                console.log(fruit + '的价格是10元/斤');
                break;
            case '香蕉':
                console.log('香蕉的价格是2元/斤');
                break;
            default:
                console.log('我们没有这种水果');
        }
    </script>
一般来说,switch  case 语句与if else语句可以相互通用。
当case值为固定值时,建议使用switch,当表达式为判断时,建议用if else;
switch判断表达式后,直接跳转到case后面的语句,效率更高;if需要多次判断,效率相对低一些。
另外,当分支较少时,if语句比switch语句效率高,当分支较多时,switch语句比if语句效率高些。
    案例:输入时间,显示问候语
        <script>
        var time = prompt('请输入时间点:');
        if (time == '12点') {
            alert('中午好');
        } else if(time == '18点') {
            alert('傍晚好');
        } else {
            alert('晚上好');
        }
    </script>
    案例:比较大小并打印
        <script>
        var num1 = prompt('请输入一个数:');
        var num2 =prompt('请再输入一个数:');
        if (num1 > num2) {
            alert(num1);
        } else {
            alert(num2);
        }
    </script>
    案例:判断奇偶数并打印
        <script>
        var num = prompt('请输入一个数:');
        if (num % 2 == 0) {
            alert(num + '是一个偶数');
        } else if (num % 2 != 0) {
            alert(num + '是一个奇数')
        }
    </script>
    案例:输入数字,显示对应星期
    <script>
        var num = prompt('请输入1!7的数字:');
        switch(num) {
            case '1':
                alert('星期一');
                break;
            case '2':
                alert('星期二');
                break;
            case '3':
                alert('星期三');
                break;
            case '4':
                alert('星期四');
                break;
            case '5':
                alert('星期五');
                break;
            case '6':
                alert('星期六');
                break;
            case '7':
                alert('星期七');
                break;
            default:
                alert('你输入的内容不合法')
        }
    </script>
    案例: 根据钱的金额,提醒用户干点啥
    <script>
        var money = prompt('您猜班长有多少钱:');
        if (money >= 2000) {
            console.log('请大家吃西餐');
        } else if (money >= 1500) {
            console.log('请大家吃快餐');
        } else if (money >= 1000) {
            console.log('请大家喝饮料');
        } else if(money >=500) {
            console.log('请大家吃棒棒糖');
        } else {
            console.log('班长下次要把钱带够哦');
        }
    </script>
3、循环结构
循环的目的,是重复执行某些语句,通常跟计数有关。重复执行的部分叫循环体,是否重复执行,取决于循环条件,由循环终止条件和循环体组成的部分叫循环语句。
(1)for循环
①for循环
❶语法结构
for(初始化变量;条件表达式;操作表达式) {
    //循环休
}
初始化变量:声明一个变量并赋值,这个变量通常作为计数器;
条件表达式:决定终止的条件;
操作表达式:主要是用来更新变量/计数器。
    <script>
        for (var i = 1; i < 5; i++) {
            console.log('*');
        }
    </script>
❷执行过程
A.首先执行初始化变量,这个步骤只执行一次;
B.然后执行条件表达式,满足则继续往下执行;
C.其次执行循环体
D.接着执行操作表达式,此时先返回表达式原值i++=1,再加1i=2;
E.然后在条件表达式、循环体、操作表达式之间一直循环,直到条件终止。
❸断点调试
使用断点调试功能可以监控程序执行的整个过程与每个细节。使用方法是,检查->sources->目标代码左右数字上点击->刷新(就设置了断点)->下一步(查看程序执行的每一步)。
如果要取消断点,就在代码代码的数字上单击一下并刷新即可。
另外,可以在watch中添加变量,用来观察变量的变化。
❹循环执行相同的代码
设置一个变量,让用户控制循环打印相同内容的次数
    <script>
        var num = prompt('请输入循环执行的次数:');
        for (var i = 1; i <= num; i++) {
            console.log('白龙网');
        }
    </script>
❺循环执行不同的代码
案例:仅仅for循环执行不同的代码
    <script>
        for(var i = 1; i <= 100; i++) {
            console.log('白龙网已经上线' + i + '年了');
        }
    </script>
案例:嵌套分支语句循环执行不同的代码,这里要注意的是条件表达式中要用比较运算符 ==
    <script>
        for(var i = 1; i <= 100; i++) {
            if(i == 1) {
                console.log('白龙网刚刚上线,有待于继续更新');
            } else if (i == 100) {
                console.log('哇,白龙网已经发展成为100年网站了');
            } else {
                console.log('白龙网是个' + i + '年的好网站');
            }
        }
    </script>
 
❻重复执行某些操作:计算1~100之间所有数的和与所有数的平均值
    <script>
        var sum = 0;
       for (var i = 1; i <= 100; i++) {
            sum += i;
       }
       console.log('总和=' + sum);
       console.log('平均值=' + sum/100);
    </script>
    案例a:求出1~100之间所有偶数之和与奇数之和
        <script>
        var even = 0,odd = 0,sum = 0;
        for(var i = 0; i <= 100; i++) {
            if(i % 2 ==0) {
                even += i;
            } else {
                odd += i;
            }
        }
        sum = even + odd;
        console.log('1-100之间的偶数之和是:' + even);
        console.log('1-100之间的奇数之和是:' + odd);
        console.log('1-100之间的奇偶数之和是:' + sum);
    </script>
    案例b:1-100之间能被3整除的数之和
        <script>
        var sum = 0;
        for (var i = 1; i <= 100; i++) {
            if (i % 3 == 0){
                sum += i;
            }
        }
        console.log('1-100之间能被3整除的数之和是:' + sum);
    </script>
    案例c:根据班级人数,输入学生成绩,并打印成绩总和,求出成绩平均值,这里的技巧在于输入一个人数用一个语句表示,而输入多个成绩则用循环来写,另外,prompt接收的数据是字符型,要转换为数字型。
        <script>
        var num = prompt('请输入班级人数:');
        var sum = 0;
        var average = 0;
        for (var i = 1; i <= num; i++) {
            var score = prompt('请输入第' + i + '个成绩');
            sum = sum +parseFloat(score);
        }
        // alert('成绩总和为:' + sum);
        average = sum/num;
        console.log('成绩之各为:' + sum);
        console.log('平均成绩为:' + average);
    </script>
    案例d:打印一行5个五角星,这里两个难点:一是定义一个空字符串,单引号内一定要加空格;二是使用追加、拼接字符串的的方法把星星放到同一行。
        <script>
        var str = ' ';
        for (var i = 1; i <= 6; i++) {
            str = str + '★';
        }
        console.log(str);
    </script>
②双重for循环
双重for循环,是两个for循环嵌套在一块,内层循环本质上是一个语句。具体执行而言,外层循环一次,内层全部循环。如下例:
    <script>
        for (var i = 1; i <= 3; i++) {
            console.log('A这是外层第' + i + '次循环');
            for (var j = 1; j <= 3; j++) {
                console.log('这是内层第' + j + '次循环');
            }
        }
    </script>
    案例:打印5行5列的星星,有3个点需要注意,一是内循环负责一行星星的打印,二是外循环负责打印5行星星,即:行数,并且每打印一行,就输出一个回车换行。
        <script>
        var str = '';
        for (var i = 1; i <= 3; i++) {            
            for (var j = 1; j <= 3; j++) {
              str += '★';
            }
            str += ' ';
        }
        console.log(str);
    </script>
    案例:倒三角形打印,循环负责行数,内循环负责一行打印的星星内容
        <script>
        var str = '';
        for (var i = 1; i <= 10; i++) {            
            for (var j = i; j <= 10; j++) {
              str += '★';
            }
            str += ' ';
        }
        console.log(str);
    </script>
    案例:打印正三角形
        <script>
        var str = '';
        for (var i = 1; i <= 10; i++) {            
            for (var j = 11 - i; j <= 10; j++) {
              str += '★';
            }
            str += ' ';
        }
        console.log(str);
    </script>
    案例:乘法口决表,这个算法的核心是每一行元素个数小于等于行号,即:j<=i;然后根据1X1=1这个算式,结合其与行号、元素数的关系,转换成代码即可。
    可以简单的理解成,先打印一个三角形的图片,然后把每行中元素修改成公式即可。
        <script>
        var str = '';
        for (var i = 1; i <= 9; i++) {            
            for (var j = 1; j <= i; j++) {
                // 1 X 2 =2
              str += j + 'x' + i + '=' + i*j + ' ';
            }
            str += ' ';
        }
        console.log(str);
    </script>   
(2)while循环
while语句,其实与for循环一样,有初始化变量,有判断表达式(为真时,执行循环休,为假时,退出循环休),计数器。如果没有计数器,会进入死循环。
    <script>
        var num = 1;
        while (num <= 100) {
            console.log(num);
            num++;
        }
    </script>
    案例:不满足条件,会一直执行下去
        <script>
        var message = prompt('');
        while(message !== '我爱你') {
            message = prompt('你爱我吗?');
        }
        alert('我也爱你哟');
    </script>
(3)do while循环
do  while与while一样,都要有初始变量,计数器,条件表达式;与while不同的是,do while是先执行一次循环体之后,再判断条件,当条件不满足时,就退出循环。
    <script>
        var i = 1;
        do {
            console.log(i);
            i++;
        } while (i <= 100);
    </script>
    三个循环语句是可以相互替换使用的;与次数有关,一般用for;更复杂的判断可以使用while或者do while。而while与do while的主要区别是谁先执行的事儿。
(4)continue与break
    ①continue 退出当前循环,直接跳转到++,继续下一轮循环,如下例,共执行4次,而第3次没有打印
        <script>
        for (var i =1; i <= 5; i++) {
            if (i == 3) {
                continue;
            }
            console.log('这是第' + i + '次输出');
        }
    </script>
   ②break 退出整个循环,剩下的程序不再执行了,如下例,程序仅执行了2次
       <script>
        for (var i =1; i <= 5; i++) {
            if (i == 3) {
                break;
            }
            console.log('这是第' + i + '次输出');
        }
    </script>
案例:求1~100内非7倍数的数之和
    <script>
        var sum = 0;
        for (var i = 1; i <= 100; i++) {
           while (i % 7 != 0) {
            sum += i;
            i++;
           }
        }
        console.log(sum);
    </script>
案例:判断输入的用户名、密码是否正确,正确则弹出登陆成功,错误则要求一直输入用户名,密码。
    <script>
        var user = prompt('请输入用户名:');
        var psd = prompt('请输入密码:');
        while (user == 'admin' && psd == '123456') {
            alert('登陆成功');
            break;
        }
        while (user != 'admin' && psd != '123456') {
            user = prompt('请输入用户名:');
            psd = prompt('请输入密码:');
        }
    </script>
案例:模拟简单的ATM机
<script>
        num = prompt('存钱请输入1 取钱请输入2 查询请输入3 退出请输入4');
        var money = 100;
        var save = 0;
        switch (num) {
            case '1':
                save = prompt('请输入存钱金额:');
                money += parseFloat(save);
                alert('您存入金额是' + save + '元 您帐户余额是' + money + '元');
                prompt('存钱请输入1 取钱请输入2 查询请输入3 退出请输入4');
                break;
            case '2':
                draw = prompt('请输入取钱金额:');
                if (parseFloat(draw) > money) {
                    prompt('余额不足,请重新输入 取钱请输入1 存钱请输入2 查询请输入3 退出请输入4');
                } else {
                    money -= parseFloat(draw);
                    alert('取款成功,帐户余额' + money + '元');
                    prompt('存钱请输入1 取钱请输入2 查询请输入3 退出请输入4');
                }
                break;
            case '3':
                alert('当前余额为' +money + '元');
                break;
                prompt('存钱请输入1 取钱请输入2 查询请输入3 退出请输入4');
            case '4': 
                    alert('欢迎下次光临');
                    break;
        }
    </script>