什么是循环语句?
- 根据给出的某一些条件 重复执行某一段代码
- 循环必须要有某些固定的内容组成
- 初始化
- 条件判断
- 要执行的代码
- 自身改变
1. while循环语句
语法: while (条件) { 满足条件就会执行 }
// 1. 初始化
var num = 1
// 2. 条件判断
while (num < 5) {
// 3. 要执行的代码 (这里的代码数量不限制)
console.log(num)
// 4. 自身的改变
num++
}
console.log(num) // 5
// 案例1:利用循环计算1~100所有数字相加的和
/*逻辑: 利用循环拿到 1~100 的所有数字
想办法保存 1~100 数字相加的和
*/
var num = 1
var s = 0
while (num <= 100) {
s += num
num++
}
console.log(s)
// 利用循环计算1~100所有偶数相加的和
var num = 1
var s = 0
while (num <= 100) {
if(num % 2 === 0){
s += num
}
num++
}
console.log(s)
// 案例2.打印出 1000~5000,内的所有闰年,否则不打印
var num = 1000
while (num <= 5000) {
if (num % 4 === 0 && num % 100 !== 0 || num % 400 === 0) {
console.log(num + '年是闰年')
}
num++
}
2. do...while 循环语句
- 是一个和 while 循环类似的循环
- 语法:
do { 要执行的代码 } while (条件) - do...while和while区别:
- while: 会先判断条件, 如果条件成立那么在开始执行循环;
- do...while: 不管条件是否成立, 先执行一次循环的代码, 然后判断条件是否成立, 决定是否开启下一轮循环。
/** 案例:
1.打开页面的时候 弹出一个输入框,让用户输入密码,密码必须为'123456'
如果输入正确,那么控制台打印'登录成功'
如果输入错误重新弹出一个输入框,让用户重新输入,直到输入正确为止
*/
do {
var pw = prompt()
if (pw === '123456') {
console.log('登录成功')
}
} while (pw !== '123456')
3. for 循环语句
语法: for (var i = 0; i < 10; i++) { 要执行的代码 }
//1.求 1~100 所有数字相乘
var sum = 1
for(var num = 1;num <= 100;num++){
sum *= num
}
console.log(sum)
//2.求 2000~3000 内的所有闰年,每打印4次闰年, 换行一次
var i = 0 //作为计数器
for(var year = 2000;year <= 3000;year++){
if(year % 4 === 0 && year % 100 !== 0 || year % 400 === 0){
document.write(year + ' ')
i++ // 上述代码执行1次, 那么计数器 + 1
if (sum === 4) {
document.write('<br>')
sum = 0 // 清零计数器, 方便开始新一轮的计算
}
}
}
//3.找出三位数所有的水仙花数
for (var num = 100; num <= 999; num++) {
var b = parseInt(num / 100)
var s = parseInt(num / 10) % 10
var g = num % 10
// if (b * b * b + s * s * s + g * g * g === num) {
if (b ** 3 + s ** 3 + g ** 3 === num) {
// ** 会得到符号左边数字的 x 次幂 4**5表示4的5次幂
console.log(num)
}
}
//求两个数的最大公约数
// 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)
4. 循环嵌套的书写
- 循环嵌套其实就是一个循环内部又写了一个循环
- 两个循环的循环变量不能相同, 会有冲突
for (var i = 0; i < 3; i++) { // 这个循环称为 外层循环
for (var k = 1; k < 4; k++) { // 这个循环称为 内层循环
/**
* 重点!!!
* 两个循环的循环变量不能相同, 会有冲突
*/
}
}
// 求 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, '是一个质数')
}
}