Bootstrap

js中的条件语句

if 分支语句

+ 概念: 根据条件决定是否执行某一段代码, 或者决定执行哪一段代码

语法形式:

1. if 语句

=> if (条件) { 代码段 }

=> 意义: 条件为 ture 的时候, {} 内的代码段执行, 否则不执行

2. if else 语句

=> if (条件) { 代码段 } else { 代码段 }

=> 意义: 条件为 true, 执行 if 后面的 {} 内的代码, 否则执行 else 后面 {} 内的代码

=> 注意: 两个 {} 内的代码, 能且只能执行一个

3. if else if ... 语句

=> if (条件) { 代码段 } else if (条件) { 代码段 } ...

=> 意义: 从第一个 if 开始依次判断每一个条件, 哪一个条件成立, 执行哪一个条件 后面 {} 内的代码

只要前面的 if 条件成立了, 那么后面的就都不管了

如果所有条件都不成立, 那么都不执行

=> 注意: 多个 {} 内的代码, 最多只能执行一个

4. if else if else 语句

=> if (条件) { 代码段 } else if (条件) { 代码段 } ... else { 代码段 }

=> 意义: 从第一个 if 开始依次判断每一个条件, 哪一个条件成立, 执行哪一个条件 后面 {} 内的代码

只要前面的 if 条件成立了, 那么后面的就都不管了

如果所有条件都不成立, 执行 else 后面 {} 内的代码

=> 注意: 多个 {} 内的代码, 能且只能执行一个

<script>
console.log('start')

    // 1. if 语句
    // var age = 16
    // if (age >= 18) {
    //   console.log('去网吧')
    // }

    // 2. if else 语句
    // var age = 16
    // if (age >= 18) {
    //   console.log('去网吧')
    // } else {
    //   console.log('借一个身份证')
    // }

    // 3. if else if 语句
    // var age = 5
    // if (age >= 18) {
    //   console.log('上大学')
    // } else if (age >= 12) {
    //   console.log('中学')
    // } else if (age >= 6) {
    //   console.log('小学')
    // }


    // 4. if else if else 语句
    var age = 5
    if (age >= 18) {
      console.log('上大学')
    } else if (age >= 12) {
      console.log('中学')
    } else if (age >= 6) {
      console.log('小学')
    } else {
      console.log('在家和小姨一起玩')
    }

    console.log('end')
  </script>

                                if语句的小联系

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      if 小练习
        + 当 if 各种语句, 代码段只有一句话的时候, 可以省略 {} 不写
          => 当你需要省略的时候, 那么 else 必须换行
    */

    // 练习1: 判断一个数字是偶数还是奇数
    // 需求: 一个数字和 2 取余是否为 0
    // var n = 13
    // if (n % 2 === 0) {
    //   console.log('偶数')
    // } else {
    //   console.log('奇数')
    // }

    // () 内的判断的内容是 n % 2 的结果
    // n % 2 的结果就是 1 或者 0
    // () 内判断的内容就是 1 或者 0
    // if (n % 2) {
    //   // 这里的代码能执行, 说明 n % 2 是 1
    //   console.log('奇数')
    // } else {
    //   // 这里的代码能执行, 说明 n % 2 是 0
    //   console.log('偶数')
    // }

    // if (n % 2) console.log('奇数')
    // else console.log('偶数')


    // 练习2: 判断一个数字是否在某一个区间内
    // 例子: 判断数字是否在 [10, 20] 之间
    // 数学角度: 10 <= 数字 <= 20
    // 代码角度: 需要同时满足两个条件, 10 <= 数字, 数字 <= 20

    // var n = 500
    // 第一步: 10 <= n 得到的结果是 true 或者 false
    // 第二步: 布尔 <= 20 得到的结果一定是 true
    // if (10 <= n <= 20) {
    //   console.log(n + ' 确实在 [10, 20] 之间')
    // }

    // var n = 5
    // if (10 <= n && n <= 20) console.log(n + ' 确实在 [10, 20] 之间')


    // 练习3: 根据成绩在控制台输出一些字母
    //    90 以上  A
    //    80 ~ 89 B
    //    70 ~ 79 C
    //    60 ~ 69 D
    //    60 以下 E
    // var score = 59
    // if (score >= 90) {
    //   console.log('A')
    // } else if (score >= 80) {
    //   console.log('B')
    // } else if (score >= 70) {
    //   console.log('C')
    // } else if (score >= 60) {
    //   console.log('D')
    // } else {
    //   console.log('E')
    // }


    // 练习4: 判断一个年份数字是不是闰年
    /*
      闰年
        能被四整除不能被100整除
        能被400整除

        闰年: year 是 4 的倍数,且 year 不是 100 的倍数的
        闰年:year 是 400 的倍数

        闰年: year % 4 === 0 && year % 100 !== 0
        闰年:year % 400 === 0
    */

    // var year = 1900

    // // 书写条件
    // if (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0) {
    //   console.log(year + ' 是闰年')
    // } else {
    //   console.log(year + ' 是平年')
    // }

  </script>
</body>
</html>

                                switch分支语句

单词:

switch: 游戏机, 岔道

case: 方案, 情况

break: 打断, 结束

default: 默认

分支语句 - switch

+ 概念: 根据你要判断的数据决定执行哪一段代码

=> 把你的数据做出很多种匹配情况, 决定执行哪一种情况

基本语法:

switch (数据) {

case 情况一:

满足情况一的时候执行的代码

break

case 情况二:

满足情况二的时候执行的代码

break

default:

所有条件都不满足的时候执行的代码

}

=> 注意1: () 内的内容不会在转换成布尔了, 都会拿到一个最终结果, 进入到 switch 中去判断

=> 注意2: 要判断的数据和每一个 case 必须是 值和数据类型(===) 都一样才叫做满足条件

=> 注意3: case 位置尽量不写表达式, 因为会按照表达式的结果来进行条件判断

=> 注意4: switch 不负责做范围性的判断

=> 注意5: default 可以不写, 不写的时候, 所有 case 都不满足就没有 代码执行

=> 注意6: break 如果不写会发生 break 穿透效果

-> 穿透效果: 不管下一个 case 是不是满足, 都会直接执行代码, 直到遇到下一个 break 或者代码整体执行完毕为止

                                                    小练习

var week = 0

    switch (week) {
      case 0:
        console.log('星期日')
      case 1:
        console.log('星期一')
      case 2:
        console.log('星期二')
      case 3:
        console.log('星期三')
      case 4:
        console.log('星期四')
      case 5:
        console.log('星期五')
      case 6:
        console.log('星期六')
      default:
        console.log('你判断的数据不是 0 ~ 6 的数字')
    }

    console.log('后续代码')
<script>
    /*
      switch 小练习
    */

    // 练习1: 根据成绩在控制台输出一些字母
    //    90 以上  A
    //    80 ~ 89 B
    //    70 ~ 79 C
    //    60 ~ 69 D
    //    60 以下 E
    /*
      A: 90 91 92 ... 99
      B: 80 81 81 ... 89
      C: 70 71 72 ... 79
      D: 60 61 62 ... 69
      E: 5x 4x 3x 2x 1x x 0
      把成绩除以 10 取整
    */
    // var score = 55

    // switch (parseInt(score / 10)) {
    //   case 10:
    //   case 9:
    //     console.log('A')
    //     break
    //   case 8:
    //     console.log('B')
    //     break
    //   case 7:
    //     console.log('C')
    //     break
    //   case 6:
    //     console.log('D')
    //     break
    //   default:
    //     console.log('E')
    // }


    // 练习2: 根据 1 ~ 12 这些数字输出当月多少天(2月暂时按照28天计算)
    var month = 9

    switch (month) {
      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
      case 2:
        console.log('28')
        break
    }
  </script>


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      练习:
        + 根据年月日三个变量信息, 判断是当年的第几天
        + 示例:
          var year = 2022
          var month = 3
          var date = 1
          结果: 2022 年 3 月 1 日是当年的第 60 天

      分析:
        + 判断闰年, 为了 2 月是 28 天还是 29 天    year
        + 确定叠加多少个整月天数                   month
        + 叠加当月的天数                          date
      思路:
        + 不管闰年, 2 月都加 28 天
        + 不管天数
        + 只考虑月份叠加

      分析月份如何叠加
        + case 12 月份  叠加 11 月    +30
        + ...
        + case 4 月份   叠加 3 月     +31
        + case 3 月份   叠加 2 月     +28
        + case 2 月份   叠加 1 月     +31
    */

    // var year = 2020
    // var month = 12
    // var date = 31

    // 初始变量不设置为 0, 就是当月日期
    // var total = date

    // 开始叠加月份
    // switch (month) {
    //   case 12: total += 30
    //   case 11: total += 31
    //   case 10: total += 30
    //   case 9: total += 31
    //   case 8: total += 31
    //   case 7: total += 30
    //   case 6: total += 31
    //   case 5: total += 30
    //   case 4: total += 31 // 叠加 3 月
    //   case 3:
    //     // 需要叠加 2 月份的整月天数, 判断一下闰年
    //     total += year % 4 === 0 && year % 100 !== 0 || year % 400 === 0 ? 29 : 28
    //   case 2: total += 31 // 叠加 1 月
    // }

    // console.log(total)



    /*
      练习:
        + 根据年月日三个变量信息, 判断是当年的第几天
        + 示例:
          var year = 2022
          var month = 3
          var date = 1
          结果: 2022 年 3 月 1 日是当年的第 60 天
        + 要求: 不能使用 switch 语句

      分析:
        + 一个 if 语句只能执行一次, 多个 if 语句
        + 月份的叠加
          => 2 月   叠加 1 月
          => 3 月   叠加 1 月 和 2 月
          => 4 月   叠加 1 月 和 2 月 和 3 月
          => 规律:
            1. 只要大于 1, 就得叠加 31
            2. 只要大于 2, 就得叠加 28
    */

    var year = 2020
    var month = 12
    var date = 31

    // 直接那日期当做基础数据开始叠加
    var total = date

    if (month > 1) total += 31
    if (month > 2) total += year % 4 === 0 && year % 100 !== 0 || year % 400 === 0 ? 29 : 28
    if (month > 3) total += 31
    if (month > 4) total += 30
    if (month > 5) total += 31
    if (month > 6) total += 30
    if (month > 7) total += 31
    if (month > 8) total += 31
    if (month > 9) total += 30
    if (month > 10) total += 31
    if (month > 11) total += 30

    console.log(total)
  </script>
</body>
</html>

                                      

                                        循环语句 while

循环: 重复的执行某一段代码

+ 代码内的循环就是数数

+ 通过数字的变化决定循环的次数

循环三要素

1. 开始: 从几开始数数

2. 结束(条件): 数到多少结束

3. 步长: 数数的间隔

while 语句:

+ while (条件) { 代码段 }

+ 当条件满足的时候, 执行 {} 内的代码段

=> 执行完毕代码段以后, 再次进行条件判断

=> 如果条件满足, 再次执行 {} 内的代码段

=> 以此类推, 直到条件不满足为止

=> 循环结束

循环内注意的事项:

+ 一定要改变初始值

循环次数的问题: 什么东西决定循环的次数

开始 结束 步长 次数

1 <=3 +1 3

2 <=3 +1 2

1 <=2 +1 2

1 <=3 +2 2

循环给我们提供了什么东西 ?

1. 重复执行代码的能力

2. 一组有规律的数字

=> 在循环内, 循环控制变量就是一组有规律的数字

循环里和循环外的 循环控制变量

+ 在循环里, 循环控制变量一定是条件为 true

+ 在循环外, 循环控制变量一定是条件为 false

console.log('start')

// 基本 while 语句

// 需求: 我需要一个三次的循环

// 1. 确定循环的开始

var n = 1

// 2. 确定循环的结束(条件)

while (n <= 20) {

console.log('执行代码', n)

// 3. 确定循环的步长

n++

}

console.log('end', n)

                                        while循环小练习

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      while 小练习
    */

    // 练习1: 在控制台输出 1 ~ 100 之间 3 的倍数
    // 方案1: 基础循环
    //   1. 拿到 1 ~ 100 之间的所有数字
    //      循环开始: 1
    //      循环结束: <= 100
    //      循环步长: +1
    // var n = 1
    // while (n <= 100) {
    //   // 判断, 如果当前这个 n % 3 === 0 才进行输出
    //   if (n % 3 === 0) console.log(n)
    //   n++
    // }
    // 方案2: 直接锁定数字
    //  第一个 3的倍数是 3
    // var n = 3
    // while (n <= 100) {
    //   console.log(n)

    //   // 步长设置为 +3
    //   n += 3
    // }


    // 练习2: 求 1 ~ 10 之间 3的倍数的 和
    //   3 + 6 + 9 === 18
    // 1. 拿到 1 ~ 10 之间所有 3 的倍数
    var n = 3
    // 2. 准备一个初始值, 接受最后求和结果
    // 问题: 初始值写在循环外面还是循环里面 ? 外面
    var sum = 0
    while (n <= 10) {
      // console.log(n)
      // 因为 n 就是每一个 3 的倍数
      // 把 n 叠加到 sum 身上即可
      sum += n

      n += 3
    }

    console.log(sum)
  </script>
</body>
</html>

      

                                循环语句 do while

+ 循环语句的一种

+ while 循环

while (条件) { 代码段 }

+ do while 循环

do { 代码段 } while (条件)

执行过程

+ 首先: 先执行一遍 {} 内的代码, 再开始条件判断

=> 如果条件满足就再次执行 {} 内的代码, 然后条件判断

=> 以此类推, 直到条件不满足的时候

=> 直接结束循环

和 while 的区别

+ 当初始内容在条件内的时候, while 和 do while 循环没有区别

+ 当初始内容在条件外的时候

=> while 循环一次都不会执行

=> do while 循环会执行一次

*/

// console.log('start')

// var n = 10

// do {

// console.log('我执行了')

// n++

// } while (n <= 3)

// console.log('end')



 

                                        小案例:页面加一个密码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      do while 小练习
        + 页面加一个密码
    */

    // 知识点: prompt
    //   语法: prompt('提示文本内容')
    //   表现形式: 一个弹出层, 一个文本框, 一个取消按钮, 一个确定按钮
    //   返回值:
    //     你点击的是取消按钮, 返回值是 null(不管写不写内容都是 null)
    //     你点击的是确定按钮, 返回值是 文本框内 输入的内容(不管你写什么, 都是字符串类型)
    // var res = prompt('你的银行卡密码是多少 ?')
    // console.log(res)
    // console.log(typeof res)

    /*
      实现业务的逻辑
        1. 打开页面就要弹出一个输入框, 让用户输入密码
        2. 开始判断你输入的对不对
          => 如果不对, 再次执行弹出输入框的代码
          => 再次判断
          => 如果对, 不再执行弹出输入框的代码
    */

    do {
      // 弹出输入框
      var res = prompt('你爱不爱我 ?')
    } while (res !== 'yes')

    alert('滚犊子')
  </script>
</body>
</html>

                                循环语句 for

循环语句的一种

语法:

for (初始变量; 条件判断; 修改初始值) { 代码段 }

原始形态:

初始变量

for (条件判断) {

修改初始值

}

console.log('start')

for (var n = 1; n <= 20; n++) {

// 在这个 {} 内只需要书写重复执行的代码即可, 不需要考虑修改初始值的问题

console.log('我执行了', n)

}

console.log('end')

                                for循环小练习

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      for 小练习
    */

    // 1. 寻找三次自幂数(水仙花数字)
    // 三次自幂数:
    //   + 保证是一个 三位数
    //   + 数字每一位的 三次幂之和 和 这个数字 相等
    // 示例: 153
    //   + 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3
    //   + 1 + 125 + 27
    //   + 153
    // 步骤1: 拿到 所有三位数
    // for (var i = 100; i <= 999; i++) {
    //   // 步骤2: 提取出每一位的数字
    //   // 2-1. 提取百位数字
    //   var a = parseInt(i / 100)
    //   // 2-2. 提取十位数字
    //   var b = parseInt(i % 100 / 10)
    //   // 2-3. 提取各位数字
    //   var c = i % 10

    //   // 步骤3: 开始判断
    //   // 取幂运算符 **
    //   // 底数 ** 指数
    //   if (a ** 3 + b ** 3 + c ** 3 === i) console.log(i + ' 是三次自幂数')
    // }



    // 练习2: 要求在页面上输出 1000 ~ 2000 之间所有的闰年, 四个一换行
    // 步骤1: 拿到 1000 ~ 2000 之间 所有的闰年在页面上输出
    // 步骤2: 准备一个计数器, 每输出一个计数器++
    // 准备一个计数器变量
    // var total = 0
    // // 书写步长的时候 +4
    // for (var i = 1000; i <= 2000; i += 4) {
    //   // 判断是否是闰年
    //   // 所有的 i 都必然是 4 的倍数
    //   if (i % 100 !== 0 || i % 400 === 0) {
    //     // 页面输出
    //     document.write(i + ' ')
    //     // 每输入一个, 计数器++
    //     total++
    //     // 当计数器到达 4 8 12 ... 需要输出一个换行
    //     total % 4 === 0 && document.write('<br>')
    //   }
    // }

    // console.log(total)


    // 练习3: 求最大公约数
    /*
      示例: 求 18 和 12 的最大公约数
        + 公约数: 1 2 3 6
        + 最大公约数: 6
        + 最大公约数的取值范围
          1 ~ 相对小的那个数字
    */

    var max = 18
    var min = 12

    // 我只要提前准备一个变量, 接受
    var res

    // 循环
    // for (var i = 1; i <= min; i++) {
    //   // 开始判断
    //   if (max % i === 0 && min % i === 0) {
    //     // console.log(i)
    //     // 找到一个公约数赋值一次
    //     res = i
    //   }
    // }

    // 倒着循环
    for (var i = min; i >= 1; i--) {
      console.log(i)
      // 开始判断
      if (max % i === 0 && min % i === 0) {
        res = i
        // 因为是从大向小查找, 找到的第一个公约数就是最大公约数
        // 只要找到一个就可以直接结束循环了
        break
      }
    }

    console.log(res)
  </script>
</body>
</html>

                            循环控制语句的暂停   

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      循环控制语句

        1. break: 是一个关键字
          => 当你在循环内遇到这个 break 的时候, 会直接结束本次循环
        2. continue: 是一个关键字
          => 当你在循环内遇到这个 continue 的时候, 会直接结束循环的本次, 去到下一次
        3. 循环控制标记语法
          => 可以在循环开始确立标记
          => 在循环内 break 和 continue 关键字在书写的时候, 后面加上标记
          => 直接回到标记位置
          => 标记书写
            标记:
    */

    // 1. break
    // for (var i = 1; i <= 5; i++) {
    //   console.log('我吃了第 ' + i + ' 个包子')

    //   if (i === 3) {
    //     console.log('我吃饱了')
    //     // 在需要的时候书写一个 break 关键字
    //     break
    //   }
    // }


    // 2. continue
    // for (var i = 1; i <= 5; i++) {
    //   console.log('我拿起了第 ' + i + ' 个包子')

    //   if (i === 3) {
    //     console.log('这个包子掉地下了')

    //     continue
    //   }

    //   console.log('我吃掉了第 ' + i + ' 个包子')
    //   console.log('-------------------------')
    // }



    // 3. 标记语法
    // a 相当于给 外层 for 循环加了一个标记
    a:
    for (var i = 1; i <= 5; i++) {
      console.log('我拿起了第 ' + i + ' 个包子')

      // 循环嵌套
      b:
      for (var j = 1; j <= 3; j++) {
        console.log('吃第 ' + i + ' 个包子的第 ' + j + ' 口')

        if (i === 3 && j === 1) {
          console.log('发现了半条虫子')

          // 直接结束有标记的循环
          break a
        }
      }

      console.log('第 ' + i + ' 个包子吃完了')
      console.log('---------------------')
    }


  </script>
</body>
</html>

                   小案例:最大公约数和最小公倍数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      最大公约数 和 最小公倍数
    */

    // 最大公约数, 辗转相除法
    /*
      逻辑: 两个数字相除, 如果可以整除, 相对小的数字就是最大公约数
        => 当不能整除的时候交换
        => 把小的数字变成大的, 用原先两个数字的余数代替小的数字
        => 重复以上步骤
      示例: 18 和 12
        => max = 18, min = 12
        1. max % min 不能整除
          -> 进行替换
          -> max = 12
          -> min = 6
        2. max % min 能整除
          -> 此时 6 就是 18 和 12 的最大公约数
      示例: 27 和 19
        => max = 27, min = 19
        1. max % min 不能整除
          -> max = 19
          -> min = 8
        2. max % min 不能整除
          -> max = 8
          -> min = 3
        3. max % min 不能整除
          -> max = 3
          -> min = 2
        4. max % min 不能整除
          -> max = 2
          -> min = 1
        5. max % min 整除
          -> 1 就是 27 和 19 的最大公约数
      代码:
        + 当 max 和 min 取余不为 0 的时候
          => 执行一段代码(重复执行)
        + 当 max 和 min 取余为 0 的时候
          => 结束循环
    */

    // var max = 27
    // var min = 19

    // // 开启循环
    // while (max % min !== 0) {
    //   // 执行一段代码
    //   // max 和 min 的从新赋值
    //   // 准备临时变量保存两个数字的余数
    //   var tmp = max % min
    //   // 把 min 的值赋值给 max
    //   max = min
    //   // 把 临时变量 的值赋值给 min
    //   min = tmp
    // }

    // // 代码来到这里, 说明 max % min === 0 为 true
    // console.log(min + ' 就是最大公约数')



    // 最小公倍数
    /*
      分析: 10 和 15 的最小公倍数
        + 公倍数  30  60  90  120  150  ....
        + 最小公倍数  30
        + 最小公倍数取值范围:
          最小就是 相对大的那个数字
          最大就是 两数乘积
          步长就是 相对大的那个数字
    */

    var min = 10
    var max = 15

    // 准备一个变量接受结果
    var res = 0

    for (var i = max; i <= min * max; i += max) {
      // 判断是不是公倍数就可以了
      // 因为循环的步长就是 max, 所以这里得到的所有的 i 都是 max 的倍数
      // 只要这个数字同时还是 min 的倍数, 那么就是公倍数了
      if (i % min === 0) {
        res = i
        // 又因为我们是从小到大循环的, 那么找到的第一个就是最小公倍数
        break
      }
    }

    console.log(min + ' 和 '+ max + ' 的最小公倍数就是 : ' + res)
  </script>
</body>
</html>

                                认识质数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      质数
        + 除了 1 和 自己本身, 其他不能整除

      逻辑: 你是如何确定一个数字是质数的 ?
        + 假设: 7
          => 7 % 2   不能整除
          => 7 % 3   不能整除
          => 7 % 4   不能整除
          => 7 % 5   不能整除
          => 7 % 6   不能整除
        + 结果
          => 如果是质数, 需要在过程后才能知道, 使得循环可以正常结束
          => 如果不是质数, 可能在过程中就知道了, 使得循环被打断从而非正常结束
        + 代码:
          => 从 2 到 自己-1 依次去整除尝试
    */

    // 方案1: 假设法(开关)
    // var n = 8
    // // 步骤1: 定义一个变量, 假设这个数字是质数
    // var flag = true // 假设 n 是质数

    // // 步骤2: 求证我的假设
    // // 从 2 到 自己-1 依次去取余, 只要有一个为 0 了
    // // 假设错误, 推翻我的假设
    // for (var i = 2; i <= n - 1; i++) {
    //   // 依次取余
    //   if (n % i === 0) {
    //     // 推翻我的假设
    //     flag = false
    //     // 只要有一个推翻了, 后面不需要了
    //     break
    //   }
    // }

    // // 循环结束以后
    // // 如果 flag === true 说明从头到尾没有被推翻过假设
    // //   说明所有的数字都不能整除, 那么就是一个质数
    // // 如果 flag === false 说明从头到尾至少有一个推翻过假设
    // //   说明至少有一个数字整除了, 那么肯定不是一个质数
    // if (flag) {
    //   console.log(n + ' 是质数')
    // } else {
    //   console.log(n + ' 不是质数')
    // }


    // var n = 7
    // // 步骤1: 定义一个变量, 假设这个数字是质数
    // var flag = true

    // // 步骤2: 求证我的假设
    // // 问题: 有必要循环到 n-1 吗 ? 只要到达自己的一半即可
    // for (var i = 2; i <= n / 2; i++) {
    //   if (n % i === 0) {
    //     flag = false
    //     break
    //   }
    // }

    // 循环结束以后
    // if (flag) {
    //   console.log(n + ' 是质数')
    // } else {
    //   console.log(n + ' 不是质数')
    // }


    // 方案2: 计数法
    // var n = 7
    // // 步骤1: 准备一个计数器
    // var total = 0

    // // 步骤2: 循环依次去尝试每一个数字是否能整除
    // //   不能整除什么都不做, 如果可以整除计数器++
    // for (var i = 2; i <= n / 2; i++) {
    //   if (n % i === 0) {
    //     total++
    //     break
    //   }
    // }

    // 如果 total 还是 0, 说明没有整除的, 是一个质数
    // 如果 total 是 1, 说明至少有一个整除了, 不是一个质数



    // 方案3: 打断循环法
    // 如果循环正常结束了, 说明 是质数
    // 如果循环非正常结束, 说明 不是质数

    // 如何判断一个循环是不是正常结束
    // for (var i = 0; i <= 5; i++) {
    //   if (i === 3) break
    // }

    // 循环结束以后
    // 如何判断循环是不是正常结束的
    // 当 i <= 5 为 false, 说明循环正常结束了
    // 当 i <= 5 为 true, 说明是在某一次循环中被打断了
    // 使用循环一模一样的条件来判断, 如果为 false, 说明循环正常结束了, 如果为 true 说明非正常结束
    // 使用循环完全相反的条件来判断, 如果为 true 说明循环正常结束了, 如果为 false 说明非正常结束
    // console.log(i, i <= 5)

    var n = 129

    for (var i = 2; i <= n / 2; i++) {
      if (n % i === 0) break
    }

    // 判断循环是不是正常结束
    i > n / 2 ? console.log(n + ' 是质数') : console.log(n + ' 不是质数')

  </script>
</body>
</html>

                                        循环嵌套的案例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    span {
      display: inline-block;
      width: 120px;
      height: 30px;
      text-align: left;
    }
  </style>
</head>
<body>
  <script>
    /*
      循环嵌套案例
        + 在一个循环内再次书写一个循环
        + 注意: 里外层循环不要使用一个变量控制
    */

    // for (var i = 1; i <= 3; i++) {
    //   console.log(i)
    //   for (var j = 1; j <= 3; j++) {
    //     console.log(' - ', j)
    //   }
    // }


    /*
      使用 * 在页面出现一个 9 * 9 的正方形

      * * * * * * * * *
      * * * * * * * * *
      * * * * * * * * *
      * * * * * * * * *
      * * * * * * * * *
      * * * * * * * * *
      * * * * * * * * *
      * * * * * * * * *
      * * * * * * * * *
    */

    // 1. 在页面输出一个 *
    // document.write('*')

    // 2. 在页面输出一行 *
    // for (var i = 1; i <= 9; i++) {
    //   document.write('* ')
    // }
    // document.write('<br>')

    // 3. 在页面输出 9 行 *
    // 步骤2 重复九次
    // for (var j = 1; j <= 9; j++) {
    //   for (var i = 1; i <= 9; i++) {
    //     document.write('* ')
    //   }
    //   document.write('<br>')
    // }


    /*
      使用 * 在页面上出现以下三角形

      *
      * *
      * * *
      * * * *
      * * * * *
      * * * * * *
      * * * * * * *
      * * * * * * * *
      * * * * * * * * *

      规律:
        => 第 1 行  1个
        => 第 2 行  2个
        => 第 3 行  3个
        => ...
        => 第 9 行  9个
    */

    // outer 循环控制多少行, 不能动
    // outer:
    // for (var i = 1; i <= 9; i++) {

    //   // inner 决定每一行多少个
    //   // 当 i === 1 的时候  第 1 行,  inner 循环应该循环 1 次    j = 1; j <= 1   1次
    //   // 当 i === 2 的时候  第 2 行,  inner 循环应该循环 2 次    j = 1; j <= 2   2次
    //   // 当 i === 3 的时候  第 3 行,  inner 循环应该循环 3 次    j = 1; j <= 3   3次
    //   // ...
    //   // 当 i === 9 的时候  第 9 行,  inner 循环应该循环 9 次    j = 1; j <= 9   9次
    //   inner:
    //   for (var j = 1; j <= i; j ++) {
    //     document.write('* ')
    //   }
    //   document.write('<br>')
    // }


    /*
      使用 * 出现以下三角形
      * * * * * * * * *
      * * * * * * * *
      * * * * * * *
      * * * * * *
      * * * * *
      * * * *
      * * *
      * *
      *
    */

    // for (var i = 1; i <= 9; i++) {

    //   // 当 i === 1 的时候, 第 1 行, inner 循环应该是 9 次   j = 1; j <= 9   9次
    //   // 当 i === 2 的时候, 第 2 行, inner 循环应该是 8 次   j = 2; j <= 9   8次
    //   // 当 i === 3 的时候, 第 3 行, inner 循环应该是 7 次   j = 3; j <= 9   7次
    //   // 当 i === 9 的时候, 第 9 行, inner 循环应该是 1 次   j = 9; j <= 9   1次
    //   for (var j = i; j <= 9; j++) {
    //     document.write('* ')
    //   }
    //   document.write('<br>')
    // }


    /*
      使用 * 出现以下三角形

                      *
                    * *
                  * * *
                * * * *
              * * * * *
            * * * * * *
          * * * * * * *
        * * * * * * * *
      * * * * * * * * *
    */

    // for (var i = 1; i <= 9; i++) {
    //   for (var j = i; j <= 9; j++) {
    //     document.write('&nbsp;&nbsp;')
    //   }

    //   for (var k = 1; k <= i; k++) {
    //     document.write('* ')
    //   }
    //   document.write('<br>')
    // }

    // 当 i === 1 的时候, j 的循环会出现第一行, 9 个空格, k 的循环会出现第一行 1 个 * 号
    // 输出一个换行
    // 当 i === 2 的时候, j 的循环会出现第二行, 8 个空格, k 的循环会出现第二行 2 个 * 号
    // 输出一个换行



    /*
      九九乘法表
    */
    for (var i = 1; i <= 9; i++) {
      for (var j = 1; j <= i; j++) {
        document.write('<span>' + j + ' * ' + i + ' = ' + (i*j) + ' </span>')
      }
      document.write('<br>')
    }
  </script>
</body>
</html>

;