2-13 JavaScript流程控制语句

134 阅读8分钟

1.if语句

	// 案例:让用户输入自己的考试成绩,反馈给他是否及格的结果
    var s = parseFloat(prompt("请输入您的成绩","67"));
    // 判断:超过60分及格
    if (s >= 60) {
      alert("恭喜你,你及格了");
    } else {
      alert("很遗憾,你没有及格");
    }

注意事项:

  • if 语句可以实现选择的功能,两个分支可以选择一个执行,不会都执行。
  • if 语句可以不写 else 分支,表示条件成立就执行后面的结构体,如果条件不成立,直接跳出 if 语句不执行。
  • if 语句后面的机构体如果是单行语句组成,可以省略 {} 不写。不建议省略大括号,容易出现程序错误。
  • if 语句能够控制自己内部的流程,但是不论走哪个分支,结束后都要继续执行 if 语句后面的其他语句,叫做殊途同归现象。

2.多分支if语句

 	// 用户输入
    var s = parseFloat(prompt("请输入您的成绩","67"));
    // 利用多分支 if 语句进行判断
    // if (s >= 85) {
    //   alert("优秀");
    // } else if (s < 85 && s >= 75) {
    //   alert("良好");
    // } else if (s < 75 && s >= 60) {
    //   alert("及格");
    // } else {
    //   alert("不及格");
    // }
    // 简化
    if (s >= 85) {
      alert("优秀");
    } else if (s >= 75) {   //如果程序能够判断到这里,说明 s 肯定是小于 85 的
      alert("良好");
    } else if (s >= 60) {    //如果程序能够判断到这里,说明 s 肯定是小于 75 的
      alert("及格");
    } else {
      alert("不及格");
    }

注意事项:

  • 多分支 if 语句中可以有多个 else if 的分支,但是 else 分支只能有一个,必须出现在最后,作为备用的选项,而且 else 也可以省略不写,表示前面条件如果都不满足,直接跳出不走任何分支。
  • 多分支 if 语句有跳楼现象:条件从上往下依次验证,如果满足了某个条件,会立即执行后面的结构体,执行完之后,不会再往后验证其他的条件了,而是从这一层直接跳楼跳出if语句,这就是跳楼现象。

3.if语句嵌套

	// 用户输入
    var sex = prompt("请输入您的性别","男");
    var age = parseInt(prompt("请输入您的年龄","45"));
    // 根据输入的数据,判断是否退休
    if (sex === "男" && age >= 60) {
      alert("恭喜你,可以享受人生了");
    } else if (sex === "男" && age < 60) {
      alert("忍忍吧,还要坚持坚持");
    } else if (sex === "女" && age >= 55) {
      alert("恭喜你,幸福人生开始了");
    } else {
      alert("太难了,还得继续坚持");
    }

    // 化简条件
    if (sex === "男" && age >= 60) {
      alert("恭喜你,可以享受人生了");
    } else if (sex === "男") {  //隐含条件:要么不是男性,要么年龄小于60
      alert("忍忍吧,还要坚持坚持");
    } else if (age >= 55) {   //隐含条件:肯定不是男性
      alert("恭喜你,幸福人生开始了");
    } else {
      alert("太难了,还得继续坚持");
    }

    // 替换方法:if 语句的嵌套
    // 外层的 if 语句只判断性别
    // 内层的 if 语句只判断年龄
    if (sex === "男") {
      // 男性,年龄需要大于60岁
      if (age >= 60) {
        alert("恭喜你,可以享受人生了");
      } else {
        alert("忍忍吧,还要坚持坚持");
      }
    } else {
      // 女性,年龄需要大于55岁
      if (age >= 55) {
        alert("恭喜你,幸福人生开始了");
      } else {
        alert("太难了,还得继续坚持");
      }
    }

4.三元表达式

虽然if语句可以模拟三元表达式,但是三元表达式有自己的优点:

  • 二选一的情况下,三元表达式结构更加简单。

  • 三元表达式作为一个表达式参与程序时必须运算出结果才能参与,可以利用这个特点,将二选一结果赋值给一个变量。

    遇到给一个变量根据条件二选一赋值的情况,可以使用三元表达式。

	console.log(true ? 1 : 0);
    console.log(false ? 1 : 0);

    // var a = 5;
    // var b;
    // if (a >= 5) {
    //   b = 1;
    // } else {
    //   b = 0;
    // }

    // 给变量赋值,根据条件二选一时,使用三元表达式更简单
    var a = 4;
    var b = a >= 5 ? 1 : 0;
    console.log(b);

5.switch语句

语句解析:

switch:关键字表示开始进入一个开关语句。 表达式:会求出一个具体的值,将这个值去与 {} 内部的 case 后面的值进行对比、 匹配,如果值相等表示匹配成功。匹配相等时,方式是进行全等于匹配, 不止值要相等,数据类型也要相等。 case:示例的意思,作为关键字后面必须跟一个空格,书写匹配的值。 case 后面的结构体:每个 case 匹配成功之后要执行的语句。 break:用于打断结构体,直接跳出程序,模拟跳楼现象。 default:相当于if语句中的 else,否则的情况,如果前面的 case 都不匹配,执行 default 后面的语句。

  • default 可以不写,相当于 if 语句没有 else。
  • break 关键字:根据结构需要有时必须在每个 case 后面都要写,为了模拟跳楼现象,如果不写 break,对应的 case 后面的语句执行之后,不会跳出结构体,会继续想下执行其他 case 的后面的语句,直到遇到一个 break。
  • 可以利用 break 不写的情况制作一些特殊的案例
  • 遇到一个变量比配多个值,适合使用switch语句
	// 用户输入
    var xingzuo = prompt("请输入您的星座","白羊座");
    进行匹配
    switch (xingzuo) {
      case "白羊座":
        alert("运势持续在线,将会是忙而充实的一天。");
        break;
      case "金牛座":
        alert("你或许需要付出更多的努力,才能实现自己的大志。");
        break;
      case "双子座":
        alert("你的脾气比较大,容易把负面情绪波及到最亲近的人。");
        break;
      case "巨蟹座":
        alert("人际关系会给你带来一些便利,善加把握会得到很多。");
        break;
      default:
        alert("对不起,数据库不全,不能找到您的星座");
        // break;
    }

    // 用 if 语句书写
    if (xingzuo === "白羊座") {
      alert("运势持续在线,将会是忙而充实的一天。");
    } else if (xingzuo === "金牛座") {
      alert("你或许需要付出更多的努力,才能实现自己的大志。");
    } else if (xingzuo === "双子座") {
      alert("你的脾气比较大,容易把负面情绪波及到最亲近的人。");
    } else if (xingzuo === "巨蟹座") {
      alert("人际关系会给你带来一些便利,善加把握会得到很多。");
    } else {
      alert("对不起,数据库不全,不能找到您的星座");
    }

    // 案例2: 输出对应月份的天数
    var month = parseInt(prompt("请输入一个月份的数字","1"));
    // 输出对应的天数
    switch (month) {
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:
        alert("这个月有31天");
        break;
      case 2:
        alert("这个月有28天或29天");
        break;
      default:
        alert("这个月有30天");
    }

6.条件分支语句总结

总结:实际工作中使用三种语句的情景。 if 语句:最常用的语句,所有的判断情况都能够书写。 三元表达式:多用于给变量赋值根据条件二选一的情况。 switch 语句:多用于给一个表达式去匹配多种固定值可能性的情况

7.for循环

是一种前测试循环语句

在反复执行一段代码之前,都要先测试入口条件,如果条件为真,可以继续循环,如果条件为假,必须跳出循环不再执行。

for 循环是一种反复执行一段代码直到测试条件为假时停止。

    // for 循环呆板语法
    for (var i = 1;i <= 100;i++) {
      console.log("小明今年" + i + "岁了");
    }
    console.log("小明百岁了");
    console.log(i);

    // 注意:②位置如果为空,或者,②条件设置的不合理,也会出现死循环
    for (var i = 1;;i++) {
      console.log(i);
    }
    for (var i = 1;i > 0;i++) {
      console.log(i);
    }

    // ①②③④位置的条件可以随意设置
    for (var i = 1;i < 10;i++) {
      console.log(i);
    }
    var i = 1;
    for (console.log("haha");i < 10;console.log("heihei")) {
      console.log(i);
      i++;
    }

    // for 内部可以嵌套 if 语句
    for (var i = 1 ; i <= 30 ; i+=4) {
      if (i % 3 == 0) {
        console.log(i);
      }
    }

    // for 循环内部嵌套 for 循环
    for (var i = 1 ; i <= 4 ; i++) {
      for (var j = 5; j <= 8 ; j++) {
        console.log(i,j);
      }
    }
  • 小括号内部必须有两个分号。
  • for 循环 {} 后面不需要加分号。
  • 如果 ② 位置语句不写,相当于没有设置入口条件,或者条件永远为真,没法限制什么时候停止循环了,出现死循环。
  • ③ 位置是循环的结构体,每次进入循环都要执行完后,才能执行语句 ④,③ 位置的语句是可以人为自定义的,甚至可以书写 if 语句。
  • for 循环嵌套 if 语句:表示既要能够执行循环,还要满足 if 语句的条件。
  • for 循环嵌套 for 循环:外层循环执行一次,内层循环作为外层 ③ 位置的结构体,必须执行完所有的内层循环,才能进入外层循环下一次的 ④。
  • 循环内的变量是全局变量,必须避免循环嵌套时起相同的变量名,内层和外层变量名必须不同,常用的变量名 i,j,k。

8.dowhile循环

  • 一种后测试循环语句,会先执行一次结构体,执行完后才会去判断入口条件

  • 如果条件为真能够继续下一次循环,如果条件为假跳出循环。

do:做什么。后面是每次循环的循环体。 while:当……时候。

  • 先执行一次循环体,然后当条件表达式为真时可以继续循环。
    // 输出1到10之间的数字
    do {
      var i = 1; // 变量自加写在里面容易被重置      
      i++;
      console.log(i);
    } while (i <= 10);

    // 应该这样写
    var i = 1;
    do {      
      i++;
      console.log(i);
    } while (i <= 10);

    // 判断条件第一次就为假时,结构也会执行一次结构体
    do {      
      i++;
      console.log(i);
    } while (i <= 0);
  • 如果循环中需要循环变量参与,循环变量必须定义在循环外面,否则会被重置。
  • 循环变量自加的过程需要写在 {} 循环体内部。
  • 如果将循环变量写在结构体内,i的初始值每次都会被重置,容易出现死循环。
  • 变量自加过程写在输出语句前面和后面,结果是不同的。
  • do while 循环即便条件第一次测试就为假,也会执行一次结构体。
  • 至少会执行一次循环体。

9.while循环

  • 一种前测试循环语句,在执行循环体之前都要测试入口条件,条件为真继续执行,条件为假直接跳出循环。
  • 当条件表达式为真时,执行循环体,如果为假,跳出循环
  • 如果需要循环变量参与,必须定义在循环外部,避免被重置。
  • 循环变量自加的过程写在循环体内部。
   // 输出1到10之间的数字
    var i = 1;
    while (i <= 10) {
      i++;
      console.log(i);
    }

遇到必须先执行一次结构体的循环,使用 do while 循环。 先测试入口条件的循环,可以选择 for 循环或 while 循环。

10.break语句

  • 我已经找到我要的答案了,我不需要进行更多的循环了!
  • break 语句的作用可以立即停止当前的 for、do while、while 循环。
  • 根据一些条件设置 break 位置,直到循环能够执行到 break 语句立即停止执行,跳出循环。
  • break 如果没有特殊指示,只能停止自己所在的那一层循环,并不能终止外部循环。
  • 如果想停止外层循环,可以给外层循环添加一个标签名 label,在内层循环的 break
  • 关键字后面空格加一个 label 名。
    // 找一下 1- 50之间有没有能够被 5 整除的数字
    // 找到一个这样的数字,就说明存在,所以不需要往后面继续验证了
    for (var i = 1 ; i <= 50 ;i++) {
      if (i % 5 == 0) {
        console.log(i);
        break;
      }
    }

    // break 只能打断本层的循环
    for (var i = 1 ; i <= 4; i++) {
      for (var j = 1 ; j <= 4; j++) {
        console.log(i,j);
        // 补充打断条件
        if (j >= 2) {
          break;
        }
      }
    }

    // 如果想终止外层循环,需要给外层循环添加一个名字
    waiceng : for (var i = 1 ; i <= 4; i++) {
      for (var j = 1 ; j <= 4; j++) {
        console.log(i,j);
        // 补充打断条件
        if (j >= 2) {
          break waiceng;
        }
      }
    }

11.continue语句

这个答案不是我想要的,赶紧试试下一个吧!

遇到 continue 表示当前的一次循环数据不是我们想要的,会立即停止当前次的循环,立即进入下一次循环。

  • 要根据特殊条件设置 continue 的位置。
  • continue 如果没有特殊指示只能进入自己的下一次循环,不能立即停止外层循环的这一次进入下一次。
  • 控制外层循环的方式与 break 一样,都是添加外层的标签名。
  • break 和 continue 这两个语句的出现可以帮助我们大量的优化代码,减少了计算机的计算次数。
    // 找到 1-30 之间不是 5 的倍数的数字进行输出
    for (var i = 1 ; i <= 30 ; i++) {
      // 排除 5 的倍数
      if (i % 5 == 0) {
        // 说明是 5 的倍数,不要往下进行输出
        continue;
      }
      // 能够执行到这里,说明不是 5 的倍数
      console.log(i);
    }

    // continue 只能进入自己的循环的下一次
    for (var i = 1 ; i <= 4; i++) {
      for (var j = 1 ; j <= 4; j++) {
        // 补充打断这一次条件
        if (j % 2 == 0) {
          continue;
        }
        console.log(i,j);
      }
    }

    // continue 要控制外层循环,需要给外层循环添加标签名
    waiceng : for (var i = 1 ; i <= 4; i++) {
      for (var j = 1 ; j <= 4; j++) {
        // 补充打断这一次条件
        if (j % 2 == 0) {
          continue waiceng;
        }
        console.log(i,j);
      }
    }

12.穷举思想

  • 实际案例中,可能需要找到一些有规律的数据,但是计算机没办法自动智能筛选所要的数据,只能程序员自己书写一段代码,让计算机根据代码去进行筛选。
  • 穷举思想:是一种解决问题的方法,将所有的需要数据所在的范围内所有的数据都一一列举出来,再根据规律的条件对所有这些数据进行筛选,这种方式就是穷举法。
制作方法:

for 循环:外层使用 for 循环进行一一列举。 if 语句:内层用 if 语句进行判断,筛选需要的数据,如果满足条件就操作数据,如果不满足条件跳过看下一次循环的数据。

    // 输出 6 的所有约数
    // 外层需要列举 1-6 之间的数字
    //     a % b = 0,a 叫做 b 的倍数,b 叫做 a 的约数。
    // 约数也叫作因数。
    // 从可能性中一一列举,筛选。
    // 一个数的约数只能是小于等于自己的数。

    for (var i = 1 ; i <= 6 ; i++) {
      // 内层判断是否是 6 的约数
      if (6 % i == 0) {
        console.log(i + "是 6 的一个约数");
      }
    }

    // 进阶:让用户随意输入一个正数,给用户输出这个数字所有的约数
    var n = parseInt(prompt("请输入一个正整数"));
    // 穷举思想,外层一一列举可能性,内层判断
    for (var i = 1 ; i <= n ; i++) {
      // 内层判断 i 是否是 n 的约数
      if (n % i == 0) {
        console.log(i + "是" + n + "的一个约数");
      }
    }

13.累加器

有时候需要的不是每个数据是什么,需要得到所有数据的加和,必须想办法将所有的数据的和存起来,就用到了累加器。

累加器本质就是变量。

实现累加的效果,就是利用循环,每次循环就将新的数据加到原始的变量中去,赋值过程是一个加等于赋值。

	// 1. 累加器   
	// 求 1-10 之间所有数字的和
    // 累加器,本质就是变量
    var n = 0;
    // 循环累加所有的数字
    for (var i = 1 ; i <= 10 ; i++) {
      // 将每一次的数据 i 要累加到 n 中去
      n += i;
      // console.log(n);
    }
    // 循环结束后就可以使用最终的累加结果
    console.log(n);

	// 2. 累乘器
    // 求 10 的阶乘
    // 累乘器,初始值必须是 1
    var mul = 1;
    for (var i = 10 ; i >= 1 ; i--) {
      mul *= i;
    }
    // 循环结束后使用累乘结果
    console.log(mul);
注意:
  • 累加器必须定义在循环外面的前面,如果定义在循环内部,每次循环都会将累加器重置,不能实现累加功能。

  • 累加器的初始值必须设置,而且必须设置为 0,不会影响累加结果。

  • 使用最终累加结果时,必须在 for 循环结束后的外面,如果写在循环内部,循环没结束,并不是最终需要的值。

  • 累乘器必须定义在循环外部前面。

  • 累乘器的初始值必须是 1,1 乘以任何数都等于本身。

  • 累乘器最终结果必须在 for 循环结束后使用。

14.水仙花案例

水仙花数是一种特殊的三位数,它的特点就是,每个数位的三次方和,等于它本身。

    // 穷举思想,列举所有的三位数
    for (var i = 100 ; i <= 999 ; i++) {
      // i 的三个数位的三次方的和,等于 i 自己
      // 找到个位、十位、百位的数字
      var ge = i % 10,
          shi = parseInt(i / 10) % 10,
          bai = parseInt(i / 100);
      // 计算三个数位的三次方的和
      var sum = ge * ge * ge + shi * shi * shi + bai * bai * bai ;
      // 判断 sum 是否等于 i 自己,如果是,就是水仙花数,需要输出
      if (sum == i) {
        console.log(i);
      }
    }