while
和do
循环
现考虑编写一个程序,输出 0 到 12 之间的所有偶数。其中一种编写方式如下所示:
console.log(0);
console.log(2);
console.log(4);
console.log(6);
console.log(8);
console.log(10);
console.log(12);
该程序确实可以工作,但编程的目的在于减少工作量,而非增加。如果我们需要小于 1000 的偶数,上面的方式是不可行的。我们现在所需的是重复执行某些代码的方法,我们将这种控制流程称为循环。
我们可以使用循环控制流来让程序执行回到之前的某个位置,并根据程序状态循环执行代码。如果我们在循环中使用一个绑定计数,那么就可以按照如下方式编写代码:
let number = 0;
while (number <= 12) {
console.log(number);
number = number + 2;
}
// → 0
// → 2
// … etcetera
循环语句以关键字while
开头。在关键字while
后紧跟一个用括号括起来的表达式,括号后紧跟一条语句,这种形式与if
语句类似。只要表达式产生的值转换为布尔值后为true
,该循环会持续进入括号后面的语句。
number
绑定演示了绑定可以跟踪程序进度的方式。 每次循环重复时,number
的值都比以前的值多 2。 在每次重复开始时,将其与数字 12 进行比较来决定程序的工作是否完成。
作为一个实际上有用的例子,现在我们可以编写一个程序来计算并显示2**10
(2 的 10 次方)的结果。 我们使用两个绑定:一个用于跟踪我们的结果,一个用来计算我们将这个结果乘以 2 的次数。 该循环测试第二个绑定是否已达到 10,如果不是,则更新这两个绑定。
let result = 1;
let counter = 0;
while (counter < 10) {
result = result * 2;
counter = counter + 1;
}
console.log(result);
// → 1024
计数器也可以从1
开始并检查<= 10
,但是,由于一些在第 4 章中澄清的原因,从 0 开始计数是个好主意。
do
循环控制结构类似于while
循环。两者之间只有一个区别:do
循环至少执行一遍循环体,只有第一次执行完循环体之后才会开始检测循环条件。do
循环中将条件检测放在循环体后面,正反映了这一点:
let yourName;
do {
yourName = prompt("Who are you?");
} while (!yourName);
console.log(yourName);
这个程序会强制你输入一个名字。 它会一再询问,直到它得到的东西不是空字符串。 !
运算符会将值转换为布尔类型再取反,除了""
之外的所有字符串都转换为true
。 这意味着循环持续进行,直到您提供了非空名称。