循环语句
-
需求: 执行 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, '个包子')
}