# 迭代和循环
# for
语句
一个 for
循环会一直重复执行,直到指定的循环条件为 false
for(let i = 0; i < 5 ; i++){
console.log(i) // 0,1,2,3,4,
}
1
2
3
2
3
# for...in
语句
for...in
语句循环一个指定的变量来循环一个对象所有可枚举的属性。JavaScript 会为每一个不同的属性执行指定的语句。
const obj = {
a: 1,
b: 2,
c: 3
}
for(key in obj) {
console.log(key) // a,b,c
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# for...of
语句
for...of
语句在可迭代对象(包括Array
、Map
、Set
、arguments
等等)上创建了一个循环,对值的每一个独特属性调用一次迭代。
let arr = [3, 5, 7];
arr.foo = "hello";
for (let i in arr) {
console.log(i); // 输出 "0", "1", "2", "foo"
}
for (let i of arr) {
console.log(i); // 输出 "3", "5", "7"
}
// 注意 for...of 的输出没有出现 "hello"
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# do...while
语句
do...while
语句一直重复直到指定的条件求值得到假值(false)
let i = 0
do {
i++
console.log(i) // 1,2,3,4,5
} while (i < 5)
1
2
3
4
5
2
3
4
5
# while
语句
一个 while 语句只要指定的条件求值为真(true)就会一直执行它的语句块
let n = 0;
let x = 0;
while (n < 3) {
n++;
x += n;
console.log("n->",n,"x->",x)
// n-> 1 x-> 1
// n-> 2 x-> 3
// n-> 3 x-> 6
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# break
语句
使用 break 语句来终止循环,switch, 或者是链接到 label 语句。
- 当你使用不带 label 的 break 时, 它会立即终止当前所在的 while,do-while,for,或者 switch 并把控制权交回这些结构后面的语句。
- 当你使用带 label 的 break 时,它会终止指定的带标记(label)的语句。
for (let i = 0; i < 5; i++) {
if (i === 3) {
break;
}
console.log(i) // 0,1,2
}
1
2
3
4
5
6
2
3
4
5
6
# continue
语句
continue
语句可以用来继续执行(跳过代码块的剩余部分并进入下一循环)一个 while
、do-while
、for
,或者 label
语句。
- 当你使用不带 label 的
continue
时, 它终止当前while
,do-while
,或者for
语句到结尾的这次的循环并且继续执行下一次循环。 - 当你使用带 label 的
continue
时, 它会应用被 label 标识的循环语句。
var i = 0;
var n = 0;
while (i < 5) {
i++;
if (i == 3) {
continue;
}
n += i;
console.log(n); // 1,3,7,12
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# label
语句
一个 label 提供了一个让你在程序中其他位置引用它的标识符。例如,你可以用 label 标识一个循环, 然后使用 break 或者 continue 来指出程序是否该停止循环还是继续循环。
未添加 Label:
let num = 0;
for (let i = 0 ; i < 10 ; i++) { // i 循环
for (let j = 0 ; j < 10 ; j++) { // j 循环
if( i == 5 && j == 5 ) {
break; // i = 5,j = 5 时,会跳出 j 循环
} // 但 i 循环会继续执行,等于跳出之后又继续执行更多次 j 循环
num++;
}
}
console.log(num); // 输出 95
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
添加 Label 后:
// break Label
let num = 0;
outPoint:
for (let i = 0 ; i < 10 ; i++){
for (let j = 0 ; j < 10 ; j++){
if( i == 5 && j == 5 ){
break outPoint; // 在 i = 5,j = 5 时,跳出所有循环,
// 返回到整个 outPoint 下方,继续执行
}
num++;
}
}
console.log(num); // 输出 55
// continue Label
let num = 0;
outPoint:
for(let i = 0; i < 10; i++) {
for(let j = 0; j < 10; j++) {
if(i == 5 && j == 5) {
continue outPoint;
}
num++;
}
}
console.log(num); // 95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27