迭代器模式
迭代器模式,用于顺序地访问聚合对象内部的元素,友无需知道对象内部结构。
关于ES6的迭代器语法,请查看阮一峰大神的书籍:ES6的Iterator
手动实现一个 forEach,完成迭代功能
1 2 3 4 5 6 7 8
| const forEach = (arr, callback) => { for (let i = 0; i < arr.length; i++) { callback(arr[i], i, arr); } } forEach(['a', 'b', 'c'], (item, index, arr) => { console.log(item, index, arr); })
|
了解迭代器语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function makeIterator(array) { let nextIndex = 0; return { next: function () { return nextIndex < array.length ? { value: array[nextIndex++], done: false } : { value: undefined, done: true }; } }; }
const iterator = makeIterator([1, 2, 3]);
let item; do { item = iterator.next(); console.log(item.value); } while (!item.done);
|
ES6规定,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”。Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。
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
| class RangeIterator { constructor(start, end) { this.start = start; this.end = end; } [Symbol.iterator]() { return this; }
next() { if (this.start <= this.end) { let value = this.start; this.start++; return { value, done: false }; } else { return { value: undefined, done: true }; } } }
function range(start, end) { return new RangeIterator(start, end); }
for (const i of range(4,6)) { console.log(i); }
|
也可以通过 Generator 函数,实现迭代器 Generator函数
1 2 3 4 5 6 7 8 9 10 11 12 13
| let myIterator = { start: 7, end: 9, [Symbol.iterator]: function* () { for (let i = this.start; i <= this.end; i++) { yield i; } } }
for (const i of myIterator) { console.log(i); }
|