初识js--循环语句(三)

183 阅读3分钟

循环语句

  • 需求: 执行 500 次console.log(1)

  • 解决方案1: 手写 500次
    弊端:将来如果修改新的需求 更加麻烦

  • 解决方案2: 利用循环语句完成也就是说用JS帮我们 重复的执行某一件事(某一段代码)

  • 循环根据给出的某一些条件 重复执行某一段代码

  • 循环的组成:
    1. 初始化
    2. 条件判断
    3. 要执行的代码
    4. 自身的改变-第四步如果不写, 那么这个循环就是一个死循环

一、while循环

1、循环案例1:

     // 1. 初始化
        var num = 1
        // 2. 条件判断
        while (num < 5) {
            // 3. 要执行的代码 (这里的代码数量不限制)
            console.log(num)

            // 4. 自身的改变
            num++
        }

2、循环案例2:

      //计算1--100所有数字相加的和
        var i = 1
        var sum = 0
        while (i <= 100) {
            sum += i
            i++
        }
        console.log(sum)
        
      //新需求:计算1--100所有偶数相加的和
        var i = 1
        var sum = 0
        while (i <= 100) {
            if (i % 2 === 0) {
                sum += i
            }
            i++
        }
        console.log(sum)

3、循环案例3:

        /*
        打开页面的时候 弹出一个输入框,让用户输入密码密码必须为123456;
        如果输入正确,那么控制台打印 登陆成功;
        如果输入错误,重新弹出一个输入框,直到正确为止
        */
        while (1) {
            var p = prompt('请输入密码:')
            if (p === '123456') {
                console.log('恭喜您,登陆成功')
                break
            }
        }

4、循环案例4:

        /*
        打印出 1000~5000,内的所有闰年,否则不打印
        */
        var i=1000
        while(i<=5000){
            if(i%4===0&&i%100!==0||i%400===0){
                console.log(i+'年是闰年')
            }
            i++
        }

二、do while循环

1、do while与while

  • while (条件) {条件成立循环执行的代码}
  • do {要循环执行的代码} while (条件)
  • 区别:
    1) while: 会先判断条件, 如果条件成立那么在开始执行循环;
    2) do...while: 不管条件是否成立, 先执行一次循环的代码, 然后判断条件是否成立, 决定是否开启下一轮循环。

2、案例:

        // 1. 初始化
        var num = 10086
        do {
            // 3. 循环要执行的代码
            console.log(num)
            // 4. 改变自身
            num++
        } while (num < 5)  // 2. 判断条件

        console.log(num)

三、for循环

1、for循环语法

         for (初始化变量;条件判断;自身改变) {
                重复执行的代码(循环体)
             } 

2、案例1(数字相乘1-100)

        //1、求1--100所有数字相乘
        var sum = 1
        for (var i = 1; i <= 100; i++) {
            sum *= i
        }
        console.log(sum)

2、案例2(求2000-3000内的闰年,每四年换一行在页面上输出)

        var j = 0
        for (var i = 2000; i <= 3000; i++) {
            if (i % 4 === 0 && i % 100 !== 0 || i % 400 === 0) {
                j++
                document.write(i + '年是闰年'+' ')
                if (j === 4) {
                    document.write('<br>')
                    j = 0//清零计数器,方便开始新一轮的计算
                }
            }
        }

3、案例3(求100--999之间的水仙花数)

        //水仙花数就是一个三位数个位的三次方+十位的三次方+百位的三次方=它本身
        for (var i = 100; i <= 999; i++) {
            var a = parseInt(i / 100)//获取百位数
            var b = parseInt(i % 100 / 10)//获取十位数
            var c = parseInt(i % 10)//获取个位数
            if (a ** 3 + b ** 3 + c ** 3 === i) {
                //`**` 代表符号左边数字的右边数字次幂
                //5 ** 10 代表数字5的10次幂
                console.log(i + '是水仙花数')
               }
        }

补充
  ** 代表符号左边数字的右边数字次幂
  例如:5 ** 10 代表数字5的10次幂

4、案例4(求两个数的最大公约数)

        // num1 和 num2 是用户输入的两个数字
        var num1 = 12
        var num2 = 8

        // num3 存储 num1 和 num2 中 最小的数字
        var num3 = num1 > num2 ? num2 : num1

        // num4 用于存储最大的公约数
        var num4 = 0

        // 1. 先找到 1~12 或者 1~8 的所有数字, 为了性能更好, 我们这里选择的是 1~8 的所有数字
        for (let i = num3; i >= 1; i--) {

            // 2. 寻找 12 和 8 的公约数
            if (num1 % i === 0 && num2 % i === 0) {
                // console.log(i)   // i 是 num1 和 num2 的公约数
                // num4 = i         // 这种书写方式存储的是最后一个 公约数, 不是最大公约数

                // 3. 找到所有的公约数中 最大的
                if (num4 < i) {
                    num4 = i
                }
            }
        }


        console.log('最大公约数: ', num4)

5、循环嵌套

  • 其实就是 在一个 for 循环中, 又书写了一个 for 循环
  • 注意点就是 两个 循环 初始化的变量 不要相同

6、案例5(求2--30之间的质数)

           // 当前案例为 判断一个数字是不是质数  =============================================

          // 假设 数字 为 n
           var n = 6
           var sum = 0 // 用于完成计数器, 当 for 循环内部的 if 语句 执行的时候, 会改变 sum 的值

         // 1. 找到 2~n-1 的所有数字
            for (var i = 2; i < n; i++) {

        // 2. 找有没有能够和 n 完成 整除的 数字
            if (n % i === 0) {
       // console.log(i, '当你看到我的时候 说明有一个数字能够和', n, '完成整除')

      // 当前 分支内 如何修改 sum 的值(修改为什么)  并不重要, 重要的是 不能等于 初始值
                sum++
                // sum = 100
                // sum = true
            }
        }

        // 只要 当前 sum === 0 就证明 上述的 循环内的分支没有执行过
        if (sum === 0) {
            console.log(n, '是一个质数')
        }
        
        
        //=============================================================================


        // 求 1~30 以内的所有质数

        // 当前循环只是拿到了 1~30 的所有数字, 没有任何特殊含义, 但是这样写 会将 数字 1 也算作 质数
        for (var n = 1; n < 31; n++) {  
            var sum = 0 // 用于完成计数器, 当 for 循环内部的 if 语句 执行的时候, 会改变 sum 的值

            // 1. 找到 2~n-1 的所有数字
            for (var i = 2; i < n; i++) {
                // 2. 找有没有能够和 n 完成 整除的 数字
                if (n % i === 0) {
                    sum++
                }
            }

            // 只要 当前 sum === 0 就证明 上述的 循环内的分支没有执行过
            if (sum === 0) {
                console.log(n, '是一个质数')
            }
        }

7、流程控制语句

1、break

  • 在循环没有进行完毕的时候,因为我们设置的条件满足了,就提前终止整个循环。
      for (let i = 1; i <= 5; i++) {
            console.log('我吃了', i, '个包子')
            if (i === 3) {
                console.log('吃饱了')
                break
            }
        }

2、continue

  • 在循环没有进行完毕的时候,因为我们设置的条件满足了,就结束当前一轮循环。
    for (let i = 1; i <= 5; i++) {
            if (i === 3) {
                console.log('掉了,不吃了')
                continue
            }
            console.log('我吃了', i, '个包子')
        }