Skip to content

Commit 95f8979

Browse files
committed
docs(iterator): edit for...of
1 parent 60dabd2 commit 95f8979

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

docs/iterator.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -508,28 +508,32 @@ for (let line of readLinesSync(fileName)) {
508508

509509
## for...of循环
510510

511-
ES6借鉴C++、Java、C#和Python语言,引入了`for...of`循环,作为遍历所有数据结构的统一的方法。一个数据结构只要部署了`Symbol.iterator`属性,就被视为具有iterator接口,就可以用`for...of`循环遍历它的成员。也就是说,`for...of`循环内部调用的是数据结构的`Symbol.iterator`方法
511+
ES6 借鉴 C++、Java、C# 和 Python 语言,引入了`for...of`循环,作为遍历所有数据结构的统一的方法。
512512

513-
for...of循环可以使用的范围包括数组、Set和Map结构、某些类似数组的对象(比如arguments对象、DOM NodeList对象)、后文的Generator对象,以及字符串。
513+
一个数据结构只要部署了`Symbol.iterator`属性,就被视为具有iterator接口,就可以用`for...of`循环遍历它的成员。也就是说,`for...of`循环内部调用的是数据结构的`Symbol.iterator`方法。
514+
515+
`for...of`循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如`arguments`对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。
514516

515517
### 数组
516518

517-
数组原生具备iterator接口`for...of`循环本质上就是调用这个接口产生的遍历器,可以用下面的代码证明。
519+
数组原生具备`iterator`接口(即默认部署了`Symbol.iterator`属性)`for...of`循环本质上就是调用这个接口产生的遍历器,可以用下面的代码证明。
518520

519521
```javascript
520522
const arr = ['red', 'green', 'blue'];
521-
let iterator = arr[Symbol.iterator]();
522523

523524
for(let v of arr) {
524525
console.log(v); // red green blue
525526
}
526527

527-
for(let v of iterator) {
528+
const obj = {};
529+
obj[Symbol.iterator] = arr[Symbol.iterator].bind(arr);
530+
531+
for(let v of obj) {
528532
console.log(v); // red green blue
529533
}
530534
```
531535

532-
上面代码的`for...of`循环的两种写法是等价的
536+
上面代码中,空对象`obj`部署了数组`arr``Symbol.iterator`属性,结果`obj``for...of`循环,产生了与`arr`完全一样的结果
533537

534538
`for...of`循环可以代替数组实例的`forEach`方法。
535539

0 commit comments

Comments
 (0)