一,流程控制语句
js 中执行顺序是从上到下。我们可以通过流程控制语句改变js语句的执行顺序,让某些语句先执行,某语句不执行。
通过条件来控制语句的执行顺序。
条件分支语句分类:if语句,三元表达式,switch语句。
⦁1.1 if语句
语法:if 如果…… else否则
1. if (条件表达式) {
2. 当满足条件表达式,执行结构体1;
3. }
4. else {
5. 当不满条件表达式,执行结构体2;
6. }
条件表达式:结果一定是布尔值,结果如果是true,满足条件;结果如果是false,不满足条件
结构体:用大括号包裹js语句。
1. // 当用户输入分数,告诉用户是否及格
2. // 的到用户输入的分数
3. var score = parseInt(prompt("请输入该次考试分数",100));
4. // if 如果 else 否则
5. if (score >= 60) {
6. // 及格,该大括号结构体执行的条件 score>=60结果是true
7. console.log("恭喜及格");
8. console.log("该次你的考试分数是" + score);
9. }else {
10. // 否则,对上面条件否定
11. // 结构体:不满足条件表达式才执行该结构体
12. // 隐含条件 score < 60
13. console.log("加把劲,努力");
14. }
⦁ else 语句可以省略,当不满足条件,直接跳出if语句,执行后面其他的语句。
1. // 请输入输入
2. var score = parseInt(prompt("请输入分数"));
3.
4. // if语句
5. if (score >= 60) {
6. console.log("及格");
7. }
8.
9. // 后面语句
10. console.log("查询结束");
⦁ 当结构体里面只有一条语句时,可以省略大括号
1. // 请输入天气,晴朗,有风
2. var w = prompt("请输入天气");
3. // 如果晴朗,出去玩 不晴朗学习
4. if (w == "晴朗")
5. console.log("出去玩耍");
6. else
7. console.log("踏实学习");
8. console.log("天气查询完毕");
9.
举例:输入晴朗 条件满足,执行if后面的结构体,输出“玩耍”,if语句跳出,执行后面的语句,输出“天气查询完毕”
.
举例:输入有风
不满足条件,执行else后面的结构体,输出“踏实学习”,跳出if语句,执行后面的语句输出“天气查询完毕”
多分支的if语句
1. if (条件1) {
2. 满足条件1,执行结构体1;
3. }else if (条件2) {
4. 不满足条件1,满足条件2执行结构体2
5. }else if (条件3) {
6. 不满足条件1和2,满足条件3执行结构体3;
7. }……
8. else {
9. 以上条件都不满足,执行该结构体
10. }
多分支的if语句,结构体只会执行一个,执行完成,立即跳出if语句。
⦁ 多分支的if语句else语句也可以省略,以上条件都不满足,直接跳出if,执行后面其他语句
1. var score = parseInt(prompt("请输入分数"));
2. if (score >= 90) {
3. console.log("优秀");
4. }else if (score >= 80) {
5. console.log("良好");
6. }else if (score >= 70) {
7. console.log("还行");
8. }else if (score >= 60) {
9. console.log("及格");
10. }
11.
12. // 后面语句的语句
13. console.log("查询结束");
⦁ “殊途同归”,不管if语句执行哪一个结构体,if语句后面的其他语句都会执行
⦁ “跳楼现象”多分支的if语句只会执行一个结构体,然后立即跳出if语句
if语句嵌套
1. /*
2. 男性大于等于22岁可以结婚;女性大于等于20可以结婚
3. 用户输入年龄,性别判断是否可以结婚
4. */
5. // 性别
6. var sex = prompt("请输入性别");
7. // 年龄
8. var age = parseInt(prompt("请输入年龄"));
9.
10. // 外层使用性别
11. if (sex === "男性") {
12. if (age >= 22) {
13. // 该结构体执行: 同时满足两个条件 sex===男性 age >= 22
14. console.log("该男性可以结婚");
15. }else {
16. // age <22
17. console.log("该男性不可以结婚");
18. }
19. console.log("该用户是男性");
20. }else if (sex === "女性") {
21. if (age >= 20) {
22. console.log("女性可以结婚");
23. }else {
24. console.log("女性不可以结婚");
25. }
26. console.log("女性查询完毕");
27. }
28.
29. console.log("查询结束");
1.2 三元表达式
三元表达式(三元运算符):
语法:条件表达式 ? 值1 : 值2;
规则:
当条件表达式为真时,三元表达式结果是值1;
当条件表达式为假时,三元表达式结果是值2;
1. var sum = false ? 1 : 0;
案例:
当结果是二选一时使用三元表达式更简单。
当工作年限不满1年,工资小于8000,年终奖为工资的1倍,否则是1.2倍;
当工作年限不满2年,工资小于10000,年终奖为工资的1.5倍,否则是1.7倍;
当工作年限等于超过2年,工资小于13000,年终奖为工资的2.3倍,否则是3倍;
用户输入年限和工资,告诉他对应的年终奖
1. // 的得到年限,0。9年 取整0
2. var year = parseInt(prompt("请输入工作年限"));
3. // 工资
4. var salary = parseInt(prompt("请输入工资"));
5. // 倍数
6. var beishu = 0;
7.
8. // 外层 使用多分支if语句,根据年限划分条件
9. if (year === 0) {
10. // 倍数1,1.2
11. if (salary < 8000) {
12. beishu = 1;
13. }else {
14. beishu = 1.2
15. }
16. }else if (year === 1) {
17. beishu = salary < 10000 ? 1.5 : 1.7;
18. }else if (year >= 2) {
19. beishu = salary >= 13000 ? 3 : 2.3 ;
20. }
21.
22.
23. // 输出,字符串拼接
24. console.log("该用户工作年限是" + year + "年,工资是" + salary + "元,对应的年终奖是" + (beishu * salary) + "元。");
1.3 switch语句
开头语句,允许程序去计算一个表示式的值,然后让这个值去匹配case标签。匹配成功执行该case标签的执行体。
1. switch (表达式){
2. case 值1:
3. 执行体1;
4. break;
5. case 值2:
6. 执行体2;
7. break;
8. case 值3:
9. 执行体;
10. break;
11. ……
12. default:
13. 执行体;
14. break;
15. }
1. // 用户输入星座,输出对应的运势
2. // 获取星座
3. var xingzuo = prompt("请输入星座");
4. switch (xingzuo) {
5. case "白羊座":
6. console.log("白羊座");
7. console.log("白羊座今日运势普通,注意处理好自己的负面情绪,不要让它影响你的生活、工作。感情方面运势一般,你可能会希望得到伴侣更多地关注和关心,但你传递给他/她很大地压力感让人");
8. break;
9. case "金牛座":
10. console.log("金牛座");
11. console.log("金牛座今日运势稍弱,遇事不要慌张,越紧张头脑越不清楚,会影响你的判断力。感情方面运势一般,伴侣的一个无心举动都可能会惹得你不高兴,情绪不佳时不妨独处一会儿。");
12. break;
13. case "双子座":
14. console.log("双子座");
15. console.log("双子座今日运势较好,抗压能力强,面对困难不会轻易气馁的你适合尝试完成高难度的事情。");
16. break;
17. default:
18. console.log("没有你输入的星座换一个吧");
19. break;
20. }
21.
22. console.log("查询结束");
break: 匹配case执行后面的break语句,不再继续向下执行后面的语句,立即跳出switch语句,执行switch后面其他语句。
default: 当以上case都没有匹配时,执行default后面的语句。(无匹配执行)
default语句中的break可以省略,当执行default后面的语句结束,也会跳出switch语句
1. // 获取数字
2. var num = parseInt(prompt("请输入数字"));
3. switch (num) {
4. case 1:
5. console.log(num);
6. break;
7. case 2:
8. console.log(++ num);
9. case 3:
10. console.log(num ++);
11. case 4:
12. console.log(num *= 2);
13. break;
14. default:
15. console.log(num + "没有匹配结果");
16. }
17. /*
18. num = 2;
19. 匹配case 2执行后面的语句
20. console.log(3); num=3
21. 没有break,语句不会结束,继续向下执行,虽然不匹配case 3,也会执行,
22. 输出console.log(3) num=4
23. 没有Break继续执行
24. console.log(8)
25. 执行break,立即跳出switch语句
26. */
利用break案例:
1. /*
2. 1,3,5,7,8,10,12 31天
3. 4,6,9,11 30天
4. 2 28天
5. */
6. // 获取月份
7. var month = parseInt(prompt("请输入月份"));
8. switch (month) {
9. case 2:
10. console.log(month + "月有28天");
11. break;
12. case 4:
13. case 6:
14. case 9:
15. case 11:
16. console.log(month + "月有30天");
17. break;
18. default:
19. console.log(month + "月有31天");
20. }
21. console.log("查询结束");
其他写法:
switch后面直接书写true,匹配case 后面书写的条件表达式
1. //分数案例
2. // 的到分数
3. var score = parseInt(prompt("请输入分数"));
4. // 计算机遇到所有的表达式,都是先计算
5. switch (true) {
6. case score >= 90:
7. console.log("优秀");
8. break;
9. case score >= 80:
10. console.log("良好");
11. break;
12. case score >= 70:
13. console.log("还行");
14. break;
15. default:
16. console.log("加油,超越自己");
17. }
18. console.log("查询结束");
总结:if语句是使用最广泛。
三元表达式当结果是二选一时,使用较简单
switch语句当值有多种可能性时。
二、循环语句
循环语句就是重复执行一段代码直到遇见某个指令时结束该循环。
直白解释:就是重复执行一段代码直到,条件为假时跳出循环。
for循环,do while,while 。
2.1 for循环
for循环,前测试循环语句。先判断是否满足循环条件,当满足条件,循环语句才会执行。
for语句不固定
1. for (循环变量初始值; 循环条件; 步长) {
2. 循环语句;
3. }
for机理:for循环判断条件表达式,当条件表达式为真时执行循环语句,直到条件为假时跳出循环。结束循环后再执行for循环后面的语句。
for循环的过程:
for循环第一次执行时,首先执行一次语句1,然后执行语句2,判断是否满足条件,当结果为真,向内执行循环语句3;如果为假,直接跳出for循环,执行语句5。
如果能进入语句3,然后执行语句4之后。再执行语句2,判断是否满足条件,当条件为真是继续向内执行语句3;如果条件为假时,跳出for循环。执行语句5.……
当条件为真时,重复执行语句2,语句3,语句4.直到条件为假时,跳出for循环,执行语句5.
我们了解for循环的过程可以宏观看for循环,可以不用输出直接根据过程得出for循环的结果。
**for语句中,循环变量i是全局变量。**可以书写在for语句外面。一般循环变量i,j,k
1. // i全局变量,可以书写在for语句外面
2. var i = 3;
3. for (; i < 8 ; i += 2) {
4. console.log(i);
5. }
循环条件可以书写成任何形式,结果一定是布尔值。
步长可以自加,可以自减
1. // 4步长,可以自加可以自减
2. for (var i = 15; i > 5; i -= 4) {
3. console.log(i);
4. }
循环语句有可能一次都不执行
1. // 循环语句有可能一次都不执行
2. var i = 3;
3. for (console.log(++ i); i < 1 ; i ++) {
4. console.log(i + "输出");
5. }
6. console.log(i + "结束");
循环语句可以一直做,条件一直为真,死循环
1. for (var i = 1; i > 0 ; i ++) {
2. console.log("输出");
3. }
4. console.log("结束");
for语句可以嵌套if语句
1. for (var i = 3; i < 20 ; i += 4) {
2. // 当i能够被5整除才输出i
3. if (i % 5 === 0) {
4. console.log(i + "能被5整除");
5. }
6. }
7. console.log("for循环结束");
for循环可以嵌套for循环,循环变量不能相同
1. for (var i = 1; i <= 3 ; i ++) {
2. for (var j = 1; j <= 3 ; j ++) {
3. console.log(i,j);
4. }
5. console.log(j);
6. }
7. console.log(i);
8. console.log(j);
2.2 穷举思想
概念:我们经常想得到一组数据,有一些特定的要求,计算机没法自己帮我们输出这些数据。我们人为的需要编写一段程序,让计算机去帮我们实现程序。将所有的可能情况,一一的列举出来,然后我们人为限定判断条件,把符合条件的数据就给它输出,不满足的就跳过,继续验证下一个数据是否满足条件,直到把所有可能情况都验证一个遍。这个方法就叫做全举法,也叫穷举法。
外层:一一列举,for循环。
内层:进行判断,if语句。
案例1:在控制台输出一个数的所有约数。
约数概念:a %b ==0,那么a叫做b的倍数,b叫做a的约数或者因数。
一个数的约数,最小是1,最大是它本身。
1. var num = parseInt(prompt("请输入数字"));
2. for (var i = 1 ; i <= num ; i ++) {
3. // 控制台只想要num约数
4. // 判断i如果是num的约数,才输出i
5. if (num % i === 0) {
6. console.log(i);
7. }
8. }
9. console.log(i + "结束");
案例2:找三位数里的“水仙花数”,在控制台输出。
条件1:三位数,得全部列举出来100,~999
条件2:水仙花数,每一个位数的三次方,他们的和,还等于原来的三位数通过判断找到符合条件的水仙花数
1. // 声明变量
2. var ge;
3. var shi;
4. var bai;
5. // 求和
6. var sum;
7. for (var i = 100 ; i < 1000; i ++) {
8. // 限制i = 134
9. ge = i % 10;
10. shi = parseInt(i / 10) % 10;
11. bai = parseInt(i / 100);
12. sum = Math.pow(ge, 3) + Math.pow(shi, 3) + Math.pow(bai, 3);
13. if (sum === i) {
14. console.log(i + "是水仙花数");
15. }
16. }
2.3 累加器和累乘器
累加器:我们不想输出所有的可能值,只想输出一个最后满足条件的总数。
1 累加器是变量,初始值0,累加器变量声明必须书写在for循环外面,防止被重置为0
2 累加器可以自加,有一个满足条件的结果就+1
3 最终结果在for循环外面输出
用户输入一个数字,输出该数字约数总个数。
1. // 1的到用户输入的数字6
2. var num = parseInt(prompt("请输入数字"));
3. // 1声明累加器,必须书写在for循环外面,初始值0
4. var sum = 0;
5. // 穷举思想一一列举
6. // 约数1-本身
7. for (var i = 1; i <= num ; i ++) {
8.
9. // 找到一个满足条件的数据累加器就自加1
10. // 2如果i是num的约数,累加器自加1
11. if (num % i === 0) {
12. sum ++;
13. }
14. }
15.
16. // 3累加器在for循环外面输出
17. console.log(num + "约数总个数是" + sum);
累乘器:保存我们前面乘数的积。
阶乘:8!= 8 * 7 * 6 * 5 * 4 * 3 *2 *1
注意:
①累乘器的变量必须写在循环外面。
②初始值必须是1.
③输出也必须是在for循环完毕之后。
1. // 的到用户输入的数字5
2. var num = parseInt(prompt("请输入数字"));
3. // 阶乘5! = 5*4*3*2*1
4. // 注意1:累乘器声明书写在for循环外,初始值1
5. var cheng = 1;
6. for (var i = num ; i >= 1 ; i --) {
7. // 注意2 累乘器使用赋值语句
8. cheng *= i;
9. }
10. // 注意3结果在for循环外输出
11. console.log(num + "阶乘是" + cheng);
用户输入一个数字,判断是不是质数。
质数:一个数除了1和他本身之外没有其他的约数
1不是质数;2是质数;7是质数
1. // 的到用户输入的数字
2. var num = parseInt(prompt("请输入数字"));
3. // 判断该数是不是质数,该数约数总个数是2就是质数
4. // 注意1声明必须书写在for外面
5. var sum = 0;
6. // 找约数一定是穷举思想
7. // 一一列举1-本身之间所有的数
8. for (var i = num ; i >= 1 ; i --) {
9. // 如果i是num的约数,sum累加器自加1
10. if (num % i === 0) {
11. // i是num的约数
12. sum ++;
13. }
14. }
15. // 注意sum累加器输出也是在for循环结束
16. if (sum === 2) {
17. console.log(num + "是质数");
18. }
⦁ 2.4do while
do while:后测试循环语句。直接执行循环语句,然后再进行出口判断,满足条件继续循环;如果条件为假跳出do while,执行后面其他的语句。
循环变量必须书写在循环语句外面。
1. do {
2. 循环语句;
3. }while (条件表达式)
1. // 后测试循环语句。先执行循环语句
2. // 注意循环变量必须声明在循环语句外面
3. var i = 3;
4. do {
5. console.log(i);
6. i += 4;
7. }while (i < 15)
8.
9. console.log("结束");
10. /*
11. i=3;直接就执行循环语句输出3;i+=4出口判断
12. i=7;i<15真,继续执行循环语句输出7;i+=4
13. i=11;i<15真,继续执行循环语句输出11;i+=4
14. i=15;i<15假立即跳出do while语句
15. 执行后面其他的
16. 输出“结束”
17. */
注意:do while循环语句至少会执行一次。
1. // do while循环语句至少会执行一次
2. // 循环变量必须书写在外面
3. var i = 3;
4. do {
5. console.log(++ i);
6. i += 4;
7. }while (i < 4);
8.
9. /*
10. i=3;直接执行循环语句输出4;i+=4
11. i=8;出口判断i<4假立即跳出do while语句
12. */
⦁ while
while语句:前测试循环语句。先判断条件,为真才执行循环语句
注意:循环变量必须书写在循环语句外面
1. // 注意:循环变量必须书写在外面
2. var i = 1;
3. while (i < 10) {
4. console.log(i);
5. i += 4;
6. }
7. console.log("结束");
while语句都可以改为for语句
1. // 改为for
2. for (var i = 1; i < 10; i += 4 ) {
3. console.log(i);
4. }
5. console.log("结束");
while语句中输出语句位置非常重要。
1. // 注意:循环变量必须书写在外面
2. var i = 1;
3. while (i < 10) {
4. i += 4;
5. console.log(i);
6. }
7. console.log(i + "结束");
8. /*
9. i=1;i<10真;i+=4;输出5
10. i=5;i<10真;i+=4;输出9
11. i=9;i<10真;i+=4;输出13
12. i=13;i<10假立即跳出
13. 输出13结束
14. */
⦁2.5 break
break: 我已经找到了一个满足条件的结果,不再继续往下执行
1. // break:执行break立即跳出循环语句
2. for (var i = 1 ; i < 200 ; i += 2) {
3. // 能被3整除
4. if (i % 3 === 0) {
5. console.log(i);
6. break;
7. }
8. }
9. console.log("结束");
10. /*
11. i=1;i<200真;i%3===0假;i+=2
12. i=3;i<200真;i%3===0真输出3;执行break立即跳出当前所在层的for语句
13. 输出”结束“
15.
16. */
作用:在循环语句for,do while,while中遇见break,只能结束break所在层的循环不能控制外层循环。
1. for (var i = 1; i <= 3 ; i ++ ) {
2. for (var j = 1; j <= 3; j ++) {
3. // 进行限制
4. if (j == 2) {
5. console.log(i,j);
6. // break只能控制j不能控制i
7. break;
8. }
9. }
10. }
11. console.log(j + "结束");
break控制外层循环:给外层循环添加标签,break引用
1. waiceng: for (var i = 1; i <= 3 ; i ++ ) {
2. for (var j = 1; j <= 3; j ++) {
3. // 进行限制
4. if (j == 2) {
5. console.log(i,j);
6. // break只能控制i不能控制j
7. break waiceng;
8. }
9. }
10. }
11. console.log(i + "结束");
12. console.log(j + "结束");
13. /*
14. vari=1;i<=3真;varj=1;j<=3真;j==2假;j++
15. j=2;j<=3真;j==2真;输出1,2执行break waiceng;跳出i循环
16. 输出1结束
17. 输出2结束
18. */
2.7continue
continue(继续):这个结果不是我想要的,赶快测试下一个。
1. // continue结束该次循环,立即执行变量改变
2. for (var i = 1; i < 10 ; i += 2) {
3. if (i % 3 === 0) {
4. continue;
5. }
6. console.log(i);
7. }
8. console.log(i + "结束");
9. /*
10. var i=1;i<10真;执行i=1这次循环i%3===0假输出1;
11. i=3;i<10真;执行i=3这次循环i%3===0真;执行continue,立即结束i=3这次循环
12. i=5;i<10真;执行i=5这次循环i%3===0假输出5;
13. i=7;i<10真;执行i=7这次循环i%3===0假输出7;
14. i=9;i<10真;执行i=9这次循环i%3===0真执行continue;立即结束该次循环
15. i=11;i<10假立即跳出i循环
16. 输出11结束
17. */
continue:遇见continue结束该次循环,立即进入下一次循环
continue也是只能结束所在层的这次循环,不能控制外层循环
1. for (var i = 1; i <= 3; i ++) {
2. for (var j = 1; j <= 3; j ++) {
3. if (j == 2) {
4. // continue只能控制j
5. continue;
6. }
7. console.log(i,j);
8. }
9. }
10. console.log(j);
11. /*
12. vari=1;i<=3真;varj=1;j<=3真;j==2假;输出1,1;j++
13. j=2;j<=3真;j==2真遇见continue结束该次循环;j++
14. j=3;j<=3真;j==2假;输出1,3;j++
15. j=4;j<=3假立即跳出j循环
16. i=2;i<=3真;varj=1;j<=3真;j==2假;输出2,1;j++
17. j=2;j<=3真;j==2真遇见continue结束该次循环;j++
18. j=3;j<=3真;j==2假;输出2,3;j++
19. j=4;j<=3假立即跳出j循环
20. i=3;i<=3真;varj=1;j<=3真;j==2假;输出3,1;j++
21. j=2;j<=3真;j==2真遇见continue结束该次循环;j++
22. j=3;j<=3真;j==2假;输出2,3;j++
23. j=4;j<=3假立即跳出j循环
24. i=4;i<=3假立即跳出i循环
25. 输出4
26.
27. */
continue想控制外层,也是通过标签绑定
1. waiceng: for (var i = 1; i <= 3; i ++) {
2. for (var j = 1; j <= 3; j ++) {
3. if (j == 2) {
4. // continue只能控制i
5. continue waiceng;
6. }
7. console.log(i,j);
8. }
9. }
10. console.log(i);
break 和 continue可以简化我们的计算过程(指的是计算机的计算过程)
案例:用户输入数字,判断该数是不是质数
1. // 的到数字8
2. var num = parseInt(prompt("请输入数字"));
3. for (var i = 2; i < num ; i ++) {
4. // 如果找到了一个约数循环就结束
5. if (num % i === 0) {
6. console.log(num + "不是质数");
7. break;
8. }
9. }
案例:输出2-100以内所有的质数。
1. // 一一列举2-100以内所有的数字
2. waiceng: for (var i = 2; i <= 100 ; i ++) {
3. // i=20,判断i是不是质数,是输出;不是赶快测试i++
4. // 一旦找到i除了1和本身之外的一个约数,断定i不是质数
5. for (var j = 2; j < i; j ++) {
6. // 判断j是不是i的约数
7. if (i % j === 0) {
8. // 找到了一个约数,断定i不是我们想要的质数,赶快测试i++
9. continue waiceng;
10. }
11. }
12. console.log(i + "是质数");
13. }