1.03---分支语句重点

74 阅读10分钟

# 分支语句

     *      JS 在执行的时候, 是按照 从上往下的顺序执行的
     * 
     *      所以我们书写的所有代码都会执行, 区别就是执行顺序的问题
     * 
     *      但是上述的执行方案会有一个小问题, 比如我想根据某一个条件决定是否执行一段代码
     * 
     * 
     *      一个代码案例:
     *          在访问一个页面的时候, 如果页面地址输入的没问题, 并且网络也能够正常访问页面
     *              那么此时一定可以正常访问页面
     *          如果上述的条件有一个不满, 比如说地址输入错误, 或者说网线被扒了
     *              那么此时页面就无法正常的访问了
     * 
     *          此时如果是前端JS处理, 那么应该是这解决的:
     *              如果条件1和条件2都成立, 那么展示一个正常的页面
     *              否则, 展示一个错误的页面 (404页面)
     * 
     * 
     *      所以分支语句的一个核心就是给了我们 基于某一个条件决定执行某一段代码的能力
     

扩展

    如果想要获取到用户输入的内容, 需要借助一个方法
     *
     *      注意: 一个 var num1 = prompt() 只能拿到用户输入一个内容
     *
     *              如果需要用户输入多个, 那么需要写多次
     *
     *          还有一个注意点就是获取到的内容是字符串格式的, 如果你需要数字的话, 请转换一下格式
     *
     *          推荐这样去转: var num1 = prompt() - 0 
    */
    // var num1 = prompt()  // 这行代码执行完毕后, 会得到用户在浏览器输入的内容
    // var num2 = prompt()  // 这行代码执行完毕后, 会得到用户在浏览器输入的内容
    // console.log(num1, num2)


    // var num1 = prompt() - 0 注意这是纯数字,这样写只是更严谨
    // var num2 = prompt() - 0
    // console.log(num1, num2)
     

if 语句

    true1(真),false0

     * 
     *      语法1:   if (条件) { 书写如果条件成立, 需要执行的代码 }
     * 
     *              条件为真 就会执行 大括号内的 代码, 否则 不执行
     *              条件可以直接书写布尔值, 也可以书写一个表达式, 或者一个数字
     *              只要你书写的不是一个布尔值, 那么会隐式转换(js自动转)为 一个布尔值
                    可以用 !取反值
     * 
     *      语法2: 
     *              if (条件) {
     *                  书写如果条件成立, 需要执行的代码
     *              } else {
     *                  当上边的条件不成立的时候, 我会执行, 如果上边的条件成立了, 我就不执行了
     *              }
     * 
     *      语法3(不推荐大量使用):
     *              
     *              if (条件1) {
     *                  如果条件1成立, 那么我会执行, 同时后续的所有 else if 或者 else 都不会执行了
     *              } else if (条件2) {
     *                  如果条件1不成立, 但是条件2成立了, 那么我会执行 , 同时后续的所有 else if 或者 else 都不会执行了
     *              } else if (条件3) {
     *                  如果条件1和条件2都不成立, 但是条件3成立了, 那么我会执行 , 同时后续的所有 else if 或者 else 都不会执行了
     *              } .....
     * 
     *      语法4(语法3的一个升级补充):
     * 
     *              if (条件1) {
     *                  如果条件1成立, 那么我会执行, 同时后续的所有 else if 或者 else 都不会执行了
     *              } else if (条件2) {
     *                  如果条件1不成立, 但是条件2成立了, 那么我会执行 , 同时后续的所有 else if 或者 else 都不会执行了
     *              } else if (条件3) {
     *                  如果条件1和条件2都不成立, 但是条件3成立了, 那么我会执行 , 同时后续的所有 else if 或者 else 都不会执行了
     *              } else {
     *                  如果上述的所有条件都不成立, 那么我会执行, 否则就不执行
     *              }
     * 
     * 
     *      注意: if 语句的难点不是如何选择 语法 1 2 3 4
     *              难点是 if 语句 的 条件如何书写
    */
    

小练习

  3. 用户输入一个年份, 判断这个年份是不是闰年

     *      条件:
     *          四年一润, 百年不润
     *          四百年补一润
     * 
     *  逻辑:
     *      1. 想办法拿到用户输入的年份
     *      2. 判断是不是闰年
     *          如果一个年份信息满足一下两个条件中的任意一个, 就算是闰年
     *              2.1 四年一润, 百年不润
     *                      year % 4 === 0 && year % 100 !== 0
     *              2.2 四百年补一润
     *                      year % 400 === 0
    */

            // 1. 想办法拿到用户输入的年份
            var year = prompt() - 0

            // 2. 判断是不是闰年
            if (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0) {
                console.log('是闰年')
            } else {
                console.log('不是')
            }
            
            

switch 语句

/* 
      switch中的表达式不会隐式转换为布尔值,而是判断这个表达式是否绝对等于值1,如果绝对等于(===)值1,就会执行语句块1
      如果不绝对等于值1,就会向下判断是否绝对等于值2,如果等于值2就会执行语句块2,否则继续向下判断,如果没有一个满足的
      则执行default后面的语句块
      
      break是跳出这个switch,当满足某个case对应的值时,执行对应语句块后,执行break就会跳出当前switch语句
      如果没有写break,就会不在判断下面的case是否相等,而直接执行下面的case后面的语句块直到break跳出
    
    */

     switch (变量) {
         case 100:
             当变量的值 === 100 的时候会执行
             break;
         case 101:
             当变量的值 === 101 的时候会执行
             break;
         default:
             当上述条件都不满足的时候, 执行
     }

    var day = 4     // 取值范围是 1~7 表明 周几

    switch (day) {
        case 1:
            console.log('周一')
            break
        case 2:
            console.log('周二')
            break
        case 3:
            console.log('周三')
            break
        case 4:
            console.log('周四')
            break
        case 5:
            console.log('周五')
            break
        case 6:
            console.log('周六')
            break
        case 7:
            console.log('周日')
            break
    }

switch 的穿透现象 (穿刺现象)

     *      在书写 case 的时候, 没有 书写 break
     *          那么如果这个 case 符合条件那么就会执行它内部的代码
     *          代码执行完毕后, 没有发现 break, 所以会继续向下执行
     *          不管 下一个 case 条件是否满足
     *          直到遇见下一个 break 或者 当前 switch 代码全都执行完毕
    */
      用户输入月份 判断当月有几天
        var m = prompt
                        }
 switch (m) {
            case 2:
                 console.log('28天')
                break
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                 console.log('31天')
                break
             case 4:
             case 6:
             case 9:
             case 11:
             console.log('30天')
                 break
          }
   优化
             switch (m) {
                case 2:
                    console.log('28天')
                    break
                case 4:
                case 6:
                case 9:
                case 11:
                    console.log('30天')
                    break
                default:
                    console.log('31天')
                 }
                 
       例子2
               var value = 86;
              switch (true) {
         // case 值其实也可以是表达式,只需要switch表达式与case中表达式是完全相等就可以
                case value > 90:
                  console.log("a");
                  break;
                case value > 80:
                  console.log("b");
                  break;
                case value > 70:
                  console.log("c");
                  break;
                case value > 60:
                  console.log("d");
                  break;
                default:
                  console.log("e");
              }
              
              
              
              状态机
                      var state="play";
                      state="run"
                      switch(state){
                          case "play":
                              console.log("执行打击的动画");
                              break;
                          case "walk":
                              console.log("执行行走的动画");
                              break;
                          case "run":
                              console.log("执行跑步的动画");
                              break;
                          case "jump":
                              console.log("执行跳跃的动画");
                              break;
                          default:
                              console.log("执行站立的动画")
                      }
                      
                     var states = "play";
                  // 如果states是play或者run或者walk,执行打印"动画"这个文字
                  // 如果stats是jump执行"跳出"打印
                  // 其他默认执行 "继续"打印

                  //   default不需要加break,有要求必须每个switch后面都有default
                  // 就是为了防止每个条件都不满足的情况下执行default
                    switch (states) {
                      case "play":
                      case "run":
                      case "walk":
                        console.log("动画");
                        break;
                      case "jump":
                        console.log("跳出");
                        break;
                      default:
                        console.log("继续");
                    }

if 与switch 小案例

    在上述代码的基础上, 再增加一个输入, 让用户输入一个年份, 根据年份决定 2 月有多少天
    var m = prompt("请输入一个月份") - 0
    var y = prompt("请输入一个年份") - 0

    switch (m) {
        case 2:
            // 根据用户输入的年份 决定输出 28 还是 29
            if (y % 4 === 0 && y % 100 !== 0 || y % 400 === 0) {
              .1 四年一润, 百年不润  条件1
                   year % 4 === 0 && year % 100 !== 0
                2 四百年补一润      条件2
                    year % 400 === 0
   
                console.log('29')
            } else {
                console.log('28')
            }
            break
        case 4:
        case 6:
        case 9:
        case 11:
            console.log('30天')
            break
        default:
            console.log('31天')
    }

三元表达式 (三元运算符/三目运算符/问号冒号表达式)

     * 
     *  也是分支语句的一种, 对 if 语句的一个优化
     * 
     *  语法:   条件 ? 条件为真的时候执行的代码(只有一行) : 条件为假的时候执行的代码
    */

    /**
     *  假设一个变量 box 他的值可能是 1 也可能是 2
     * 
     *  我们要根据 这个变量的值 去创建一个新的变量, 内部的值存储为 成功或者失败
     * 
     *  我们自己约定 如果值 === 1 那么为成功, 其他情况 为失败
    */

    // if 语句完成上述需求
    // var box = 2
    // var msg;
    // if (box === 1) {
    //     msg = '成功'
    // } else {
    //     msg = '失败'
    // }
    // console.log(msg)


    // 利用 三元表达式优化上述的 if 语句
    var box = 1
    // var msg = 条件 ? 条件为真的时候执行的代码(只有一行) : 条件为假的时候执行的代码
    var msg = box === 1 ? '成功' : '失败'

    console.log(msg)
    

分支语句案例

  1. 一辆出租车, 起步价(2公里内)7元, 超过2公里的按照每公里3元收费, 请根据路程计算费用

         * 
         *  逻辑:
         *      用户输入一个路程
         *      判断用户的路程是否超过 2公里
         *          超过
         *              7元 + (总路程 - 2公里) * 3
         *          不超过
         *              7 元
        */
    
        var n = prompt() - 0
    
        if (n > 2) {
            // 总路程超过了 起步价范围, 所以需要计算一个总价
            console.log(7 + (n - 2) * 3)
        } else {
            // 路程不超过 2 公里, 按照 起步价收费 7元
            console.log(7)
        }
        
        
    

2. 根据性别和体重计算献血量

            * 女性: 体重不超过 50kg 的献血 200毫升, 否则 250毫升
            * 男性: 体重不超过 60kg 的献血 250毫升, 否则 300毫升
            
            逻辑:
                1. 有两个输入框 收集用户输入的 性别和体重
                    约定: 性别输入的内容为 男/女
                2. 判断为男性还是女性
                3. 确定了性别后, 再次判断 体重
    */

     var s = prompt('输入性别')
     var t = prompt('输入体重') - 0
    // 外层分支语句用于 区分 性别
         if (s === '女') {
         // 内层的分支语句用于 区分体重
         if (t < 50) {
             console.log('200毫升')
        } else {
             console.log('250毫升')
         }
        } else {
         // 内层的分支语句用于 区分体重
         if (t < 60) {
             console.log('250毫升')
        } else {
             console.log('300毫升')
        }
   }

3. 居民用电分为 3 个梯度, * 每月用电量为 150 千瓦时以下时, 每千瓦时收费 1元; * 151---400 这个区间收费为 2 元; * 401千瓦时以上部分为 3 元 * 当用户输入用电量时, 计算出所需支付的电费

            逻辑:
                1. 用户输入用电量
                2. 判断 用户的用电量属于那个区间
                    150 及以下
                        n * 1
                    151---400  注意第二区间点包括151
                        150 * 1 + (n - 150) * 2
                    401开始  包括401
                        150 * 1 + (400 - 150) * 2 + (n - 400) * 3
        */

        var n = prompt() - 0

        if (n <= 150) {
            // 用电量 不超过 150, 此时所有用电量都是 1元1度
            console.log(n * 1)
        } else if (n > 150 && n < 401) {
            // 用电量超过了 150, 但是不超过 400, 计算的时候 这个用电量中 有 150度是1元的, 剩下的是2元1度
            console.log(150 * 1 + (n - 150) * 2)
        } else {
            /**
             *  用电量 超过了 400 度
             *      但是 内部有 150 度是1元1度
             *      还有 (400 - 150) 度是2元1度
             *      剩下的才是 3元1度
            */

        var box = 150 * 1 + (400 - 150) * 2 + (n - 400) * 3
        console.log(box)
    }