@@ -31,7 +31,7 @@ while (i < 3) { // 结果分别是 0、1、2
31
31
32
32
循环体的单次执行叫作** 一次迭代** 。上面示例中的循环进行三次迭代。
33
33
34
- 如果上述示例中没有 ` i++ ` ,那么循环(理论上)会永远重复。实际上,浏览器提供了阻止这种循环的方法,对于服务器端 JavaScript,我们可以终止该过程 。
34
+ 如果上述示例中没有 ` i++ ` ,那么循环(理论上)会永远重复。实际上,浏览器提供了阻止这种循环的方法,对于服务器端 JavaScript,我们可以终止该进程 。
35
35
36
36
任何表达式或变量都可以是循环条件,而不仅仅是比较。对它们进行计算,并通过 ` while ` 将其结果转化为布尔值。
37
37
@@ -47,8 +47,8 @@ while (i) { // 当 i 变成 0 时,条件为 false,循环终止
47
47
}
48
48
```
49
49
50
- ```` smart header="Brackets are not required for a single-line body "
51
- 如果循环体只有一条语句,则可以省略括号 `{…}`:
50
+ ```` smart header="对于单行循环体,大括号并不需要 "
51
+ 如果循环体只有一条语句,则可以省略大括号 `{…}`:
52
52
53
53
```js run
54
54
let i = 3;
84
84
85
85
## "for" 循环
86
86
87
- ` for ` 循环是最常使用的 。
87
+ ` for ` 循环更加复杂,但它是最常使用的循环形式 。
88
88
89
89
看起来就像这样:
90
90
91
91
``` js
92
92
for (begin; condition; step) {
93
- // ... loop body ...
93
+ // ……循环体……
94
94
}
95
95
```
96
96
97
- 我们通过示例来了解这部分的含义。下述循环运行从 ` i ` 等于 ` 0 ` 到 ` 3 ` (但不包括 ` 3 ` )的 ` alert(i) ` :
97
+ 我们通过示例来了解这三个语句段(part)的含义。下述循环从 ` i ` 等于 ` 0 ` 到 ` 3 ` (但不包括 ` 3 ` )运行 ` alert(i) ` :
98
98
99
99
``` js run
100
100
for (let i = 0 ; i < 3 ; i++ ) { // 结果为 0、1、2
101
101
alert (i);
102
102
}
103
103
```
104
104
105
- 我们逐部分地检查 ` for ` 语句:
105
+ 我们逐个语句段分析 ` for ` 语句:
106
106
107
- | 部分 | | |
107
+ | 语句段 | | |
108
108
| -----| ----------| ----------------------------------------------------------------------------|
109
- | 开始 | ` i = 0 ` | 进入循环时执行一次。 |
110
- | 条件 | ` i < 3 ` | 在每次循环迭代之前检查,如果失败,循环停止。 |
111
- | 步骤 | ` i++ ` | 在每次迭代后执行主体,但在条件检查之前执行。 |
112
- | 主体 | ` alert(i) ` | 条件为真时,重复运行。 |
113
-
109
+ | begin | ` i = 0 ` | 进入循环时执行一次。 |
110
+ | condition | ` i < 3 ` | 在每次循环迭代之前检查,如果失败,循环停止。 |
111
+ | step | ` i++ ` | 主体每次迭代后执行,但在条件检查之前执行。 |
112
+ | body(循环体) | ` alert(i) ` | 条件为真时,重复运行。 |
114
113
115
114
一般循环算法的工作原理如下:
115
+
116
116
```
117
- Run begin
118
- → (if condition → run body and run step)
119
- → (if condition → run body and run step)
120
- → (if condition → run body and run step)
117
+ 开始运行
118
+ → (如果 condition 成立 → 运行 body 然后运行 step)
119
+ → (如果 condition 成立 → 运行 body 然后运行 step)
120
+ → (如果 condition 成立 → 运行 body 然后运行 step)
121
121
→ ...
122
122
```
123
123
124
+ 所以,` begin ` 执行一次,然后进行迭代:每次检查 ` condition ` 后,` body ` 和 ` step ` 被执行。
125
+
124
126
如果您是循环方面的小白,那么回到这个例子,在一张纸上重现它逐步运行的过程,可能会对你有所帮助。
125
127
126
128
以下是我们示例中发生的情况:
@@ -139,7 +141,7 @@ if (i < 3) { alert(i); i++ }
139
141
// ...结束,因为现在 i == 3
140
142
```
141
143
142
- ```` smart header="Inline variable declaration "
144
+ ```` smart header="内联变量声明 "
143
145
这里“计数”变量 `i` 在循环中声明。这叫做“内联”变量声明。这样的变量只在循环中可见。
144
146
145
147
```js run
@@ -164,23 +166,23 @@ alert(i); //3,可见,因为在循环之外声明
164
166
````
165
167
166
168
167
- ### 跳过
169
+ ### 省略语句段
168
170
169
- ` for ` 循环的任何部分都可以被跳过 。
171
+ ` for ` 循环的任何语句段都可以被省略 。
170
172
171
- 例如,如果我们在循环开始时不需要做任何事,我们可以省略 ` begin ` 部分 。
173
+ 例如,如果我们在循环开始时不需要做任何事,我们可以省略 ` begin ` 语句段 。
172
174
173
175
就像这样:
174
176
175
177
``` js run
176
- let i = 0 ; // 我们已经声明并分配了
178
+ let i = 0 ; // 我们已经声明了 i 并对它进行赋值了
177
179
178
- for (; i < 3 ; i++ ) { // "begin" 部分不再需要
180
+ for (; i < 3 ; i++ ) { // "begin" 语句段不再需要
179
181
alert ( i ); // 0, 1, 2
180
182
}
181
183
```
182
184
183
- 我们也可以移除 ` step ` 部分 :
185
+ 我们也可以移除 ` step ` 语句段 :
184
186
185
187
``` js run
186
188
let i = 0 ;
@@ -245,13 +247,13 @@ for (let i = 0; i < 10; i++) {
245
247
// 如果为真,跳过循环体的剩余部分。
246
248
* ! * if (i % 2 == 0 ) continue ;*/ ! *
247
249
248
- alert (i); // 1、3、5、7、 9
250
+ alert (i); // 1,然后 3,5,7, 9
249
251
}
250
252
```
251
253
252
- 对于偶数的 ` i ` ,` continue ` 指令停止执行 ,将控制权传递给下一次 ` for ` (使用下一个数字)的迭代。因此 ` alert ` 仅被奇数值调用。
254
+ 对于偶数的 ` i ` ,` continue ` 指令停止了循环体的继续执行 ,将控制权传递给下一次 ` for ` (使用下一个数字)的迭代。因此 ` alert ` 仅被奇数值调用。
253
255
254
- ````smart header="The directive ` continue ` helps to decrease nesting level "
256
+ ````smart header="` continue ` 指令利于减少嵌套 "
255
257
显示奇数的循环如下所示:
256
258
257
259
``` js
@@ -266,10 +268,10 @@ for (let i = 0; i < 10; i++) {
266
268
267
269
从技术角度看,它与上述示例完全相同。当然,我们可以将代码包装在 ` if ` 块而不是 ` continue ` 块。
268
270
269
- 但作为副作用,我们还有一个嵌套级别(花括号内的 ` alert ` 调用)。如果 ` if ` 中代码超过几行,则可能会降低总体可读性。
271
+ 但至于副作用,它创建多一个嵌套级别(大括号内的 ` alert ` 调用)。如果 ` if ` 中代码超过几行,则可能会降低总体可读性。
270
272
````
271
273
272
- ````warn header="No `break/continue` to the right side of '?' "
274
+ ````warn header="禁止 `break/continue` 在‘?’的右边 "
273
275
请注意非表达式的语法结构不能与三元运算符 `?` 一起使用。特别是 `break/continue` 这样的指令是不被允许使用的。
274
276
275
277
例如,我们使用如下代码:
@@ -282,17 +284,16 @@ if (i > 5) {
282
284
}
283
285
```
284
286
285
- ... 然后用问号重写:
287
+ …… 然后用问号重写:
286
288
287
289
288
290
```js no-beautify
289
- (i > 5) ? alert(i) : *!*continue*/!*; // continue not allowed here
291
+ (i > 5) ? alert(i) : *!*continue*/!*; // continue 不允许在这个位置
290
292
```
291
293
292
- ... 然后会停止运行。这样的代码将给出语法错误:
294
+ …… 然后会停止运行。这样的代码将给出语法错误:
293
295
294
-
295
- 这只是不适用 `?` 而不是 `if` 的另一个原因。
296
+ 这只是不使用 `?` 而不是 `if` 的另一个原因。
296
297
````
297
298
298
299
## break/continue 标签
@@ -318,7 +319,7 @@ alert('Done!');
318
319
319
320
如果用户取消输入,我们需要另一种方法来停止这个过程。
320
321
321
- 在 ` input ` 之后的普通 ` break ` 只会打破内部循环。这还不够。 标签可以拯救。
322
+ 在 ` input ` 之后的普通 ` break ` 只会打破内部循环。这还不够 —— 标签可以拯救。
322
323
323
324
** 标签** 是在循环之前带有冒号的标识符:
324
325
``` js
@@ -327,9 +328,7 @@ labelName: for (...) {
327
328
}
328
329
```
329
330
330
- ` break <labelName> ` 语句跳出循环至标签处。
331
-
332
- 就像这样:
331
+ ` break <labelName> ` 语句跳出循环至标签处:
333
332
334
333
``` js run no-beautify
335
334
* ! * outer: */ ! * for (let i = 0 ; i < 3 ; i++ ) {
@@ -341,7 +340,7 @@ labelName: for (...) {
341
340
// 如果是空字符串或已取消,则中断这两个循环。
342
341
if (! input) * ! * break outer* / !* ; / / (* )
343
342
344
- // 做些有价值的事
343
+ // 用得到的值做些事……
345
344
}
346
345
}
347
346
alert (' Done!' );
@@ -360,7 +359,7 @@ for (let i = 0; i < 3; i++) { ... }
360
359
361
360
` continue ` 指令也可以与标签一起使用。在这种情况下,执行跳转到标记循环的下一次迭代。
362
361
363
- ```` warn header="Labels are not a \" goto \" "
362
+ ```` warn header="标签不允许“跳到”任何位置 "
364
363
标签不允许我们跳到任意代码位置。
365
364
366
365
例如,这样做是不可能的:
@@ -385,4 +384,4 @@ label: for (...)
385
384
386
385
如果我们不想在当前迭代中做任何事,并且想要转移至下一次迭代,那么 ` continue ` 指令就会执行它。
387
386
388
- ` break/continue ` 支持循环前的标签。标签是 ` break/continue ` 避免嵌套并转到外部循环的唯一方法 。
387
+ ` break/continue ` 支持循环前的标签。标签是 ` break/continue ` 跳出嵌套循环来转到外部循环的唯一方法 。
0 commit comments