循环不可或缺三要素,有显式的,也有隐式的(如下面代码里的第4、5个例子)。所谓的死循环
,存在跳出机制,这样的机制离不开三要素;真正的死循环会被叫做BUG或者病毒。
/* 初始化 let i = 1;
终止条件 i < 10;
“步长” i++
*/
for (let i = 1; i < 10; i++) { console.log(i); }
/* 初始化 let j = 1;
终止条件 j < 10;
“步长” j++
*/
let j = 1; while (j < 10) { console.log(i); i++; }
/* 初始化 let k = 1;
终止条件 k < 10;
“步长” k++
*/
let k = 1; do { console.log(k); k++; } while (k < 10)
/* 初始化 let m = 1;
终止条件 m < 10;
“步长” m++
*/
let m = 1;
while (1) { if (m > 10) break; console.log(m); m++; }
/* 初始化 let n = 1;
终止条件 n < 10;
“步长” n++
*/
let n = 1;
for (;;) { if(n > 10) break; console.log(n); n++; }
;
必须保留。for (初始化; 终止条件; 步长) {
// 循环体
}
先判断条件,条件为真,执行循环体。
while (条件) {
// 循环体
}
先执行了一遍循环体,在根据条件判断是否需要继续。
do {
// 循环体
} while (条件);
for (let j = 1; j < 4; j++) {
let i = 1;
while (i < 5) {
if (i % 2) continue; // 遇到奇数,直接跳过,进入下一次迭代
console.log(i * j);
i++;
}
}
单纯的 break
,只会跳出最近的一层循环。
for (let j = 1; j < 4; j++) {
let i = 1;
while (1) {
if (i > 4) break; // 结束 while (1) 循环
console.log(i * j);
i++;
}
}
break 标签号
:从代码块里跳出(跳到指定标签的位置),循环体就是一个个的块,所以此语法常用于跳出指定层次的循环;continue 标签号
:只能在循环中使用,换句话说 continue 循环标签号
,可以跳入指定标签循环的下一次迭代。/* break 标签号 */
outer: for (let i = 1; i < 3; i++) {
let j = 1;
inner: while (j < 5) {
if (i * j > 5) break outer; console.log(i * j); j++; }
}
/* contiune 标签号 */
label: for (let i = 1; i < 4; i++) {
console.log(`外循环第 ${i} 次迭代开始`);
for (let k = 1; k < 3; k++) {
if (k == 1) continue label; // 跳到外循环的下一次迭代了。
console.log(`第 ${k} 次内循环迭代`);
}
console.log(`外循环第 ${i} 次迭代结束`);
}
/* 错因:要从代码块跳出去 */
break label
label: {
}
/* 错因:inner1跳出块,但是不能跳到后面的标签,报标签未定义的错 */
outer: for (let i = 1; i < 3; i++) {
let j = 1;
inner1: while (j < 5) { // 偶数跳到inner2
if (!(j % 2)) break inner2; j++; console.log("inner1接收到一个奇数"); }
inner2: while (j < 5) { // 奇数跳到inner1
if (j % 2) break inner1; j++; console.log("inner2接收到一个偶数"); }
}
/* 报错:不存在迭代 */
label: { let a = 1; continue label; }