循环(loop)用于重复执行一段代码。while 循环会先判断条件(condition),只要条件为 true,就执行循环体;循环体执行完后,再回到条件处重新判断。
while 的基本结构
一个稳定的 while 循环通常包含三件事:
- 初值:循环开始前,先准备循环变量。
- 条件:每一轮开始前,判断是否继续循环。
- 更新:每一轮循环中,让循环变量发生变化。
let i = 1;
while (i <= 5) {
console.log("In loop: i = " + i);
i++;
}
console.log("After loop: i = " + i);运行结果:
循环中:i = 1
循环中:i = 2
循环中:i = 3
循环中:i = 4
循环中:i = 5
循环结束后:i = 6while 的特点是先判断、再执行。因此循环体可能执行多次,也可能一次都不执行。
逐行调试 while 与 do-while 循环
像调试器一样逐行执行代码。蓝色行是下一条语句,右侧会同步显示变量和输出。
01let i = 1;02while (i <= 5) {03 console.log(i);04 i++;05}06console.log(i);
>>>
知识测验
累加与平均值
循环经常和累加变量一起使用。下面的程序读取 5 个人的身高,并计算平均值。
const NUM_PEOPLE = 5;
let total = 0;
let i = 1;
while (i <= NUM_PEOPLE) {
let height = Number(prompt("Enter a number:"));
total += height;
i++;
}
let average = total / NUM_PEOPLE;
console.log(`Average height: ${average.toFixed(2)}`);一次可能的运行过程:
请输入第 1 个人的身高:160.8
请输入第 2 个人的身高:175.2
请输入第 3 个人的身高:171.2
请输入第 4 个人的身高:181.3
请输入第 5 个人的身高:164
平均身高:170.50total += height 的意思是把本次输入的身高加到累计总和里。循环结束后,total 保存的是所有身高之和。
知识测验
do-while 与循环直到条件改变
while 适合处理“循环次数不一定一开始就知道”的任务。例如,计算一个整数有多少位。
let num = Math.abs(Number(prompt("Enter an integer:")));
let digits;
if (num === 0) {
digits = 1;
} else {
digits = 0;
while (num !== 0) {
num = Math.floor(num / 10);
digits++;
}
}
console.log("Digits: " + digits);一次可能的运行结果:
请输入一个整数:123
位数:3这里额外处理了 0。如果直接写 while num !== 0,输入 0 时循环一次也不会执行,位数会被错误地算成 0。
知识测验
猜数字游戏
还有一种常见场景是:程序不知道用户需要尝试多少次。猜数字游戏就是一个典型例子。程序先随机生成答案,然后不断读取用户输入;如果猜大了就提示“太大”,猜小了就提示“太小”;猜中后,do-while 的条件变为假,循环结束。
Math.random() 会生成 0(含)到 1(不含)之间的小数。乘以 100 后调用 Math.floor(),再加 1,就能得到 1–100 的整数。
const secret = Math.floor(Math.random() * 100) + 1;
let guess;
do {
guess = Number(prompt("请输入 1 到 100 之间的数字:"));
if (guess > secret) {
console.log("太大了");
} else if (guess < secret) {
console.log("太小了");
}
} while (guess !== secret);
console.log("猜对了!");一次可能的运行过程:
请猜一个数字:50
太大
请猜一个数字:25
太小
请猜一个数字:37
太小
请猜一个数字:43
太大
请猜一个数字:40
太大
请猜一个数字:38
太小
请猜一个数字:39
猜对了!你一共猜了 7 次。这里使用 do-while,因此至少会读取一次输入;猜中后循环条件变为假,程序继续执行循环后的语句。
猜数字循环实验
答案会在 1–100 之间随机生成。根据“太大/太小”提示缩小蓝色候选区间,猜中时观察 break 如何结束循环。
01let answer = Math.floor(Math.random() * 100) + 1;02while (true) {03 let guess = Number(prompt("Enter an integer:"));04 if (guess === answer) {05 console.log("猜对了!");06 break;07 } else if (guess > answer) {08 console.log("太大");09 } else {10 console.log("太小");11 }12}
>>>
用 while 计算倒数和
读取一个正整数 n,用 while 计算 1 + 1/2 + 1/3 + ... + 1/n。
- 读取一个正整数 n。
- 用 while 循环逐项累加 1/i。
- 最后输出保留两位小数的总和。
用 while 计算整数各位之和
逐位取出一个正整数的个位数,并把这些数字累加起来。
- 读取一个正整数 num。
- 在 while 循环中不断取出个位数并加入 digitSum。
- 循环结束后输出各位数字之和。