使用迭代器的目的:更高效的操作数据。使用迭代器可以使访问数据和操作数据的过程中,不需要追踪索引。
传统的for循环:
for (let I=0; I<10; I++){
...
// 访问数据的过程中,需要追踪索引 i 的值。并不方便且容易出错。
}
学习了迭代器后,就会发现数据访问会变的简洁很多。
什么是迭代器
迭代器是一种特殊的对象,所有的迭代器对象都有一个 next 方法,调用 next 方法会返回一个对象——该对象有两个属性:一个是 value,表示下一个要返回的值;一个是 done,表示是否有更多数据可以返回:当数据访问结束,done 就会置为 true。并且,当 done = true 的时候,value = undefined。
const iterator = createIterator([1, 2, 3])
iterator.next(); // {value: 1, done: false}
iterator.next(); // {value: 2, done: false}
iterator.next(); // {value: 3, done: false}
iterator.next(); // {value: undefined, done: true}
如何生成一个迭代器?试试生成器咯
在 ES6 中,引入了一个生成器对象,它可以让迭代器对象生成的过程变得简单。
// 生成器语法
function *createIterator() {
yield 1;
yield 2;
yield 3;
}
const iterator = createIterator() // 与普通函数调用方法一致
iterator.next(); // {value: 1, done: false}
iterator.next(); // {value: 2, done: false}
iterator.next(); // {value: 3, done: false}
iterator.next(); // {value: undefined, done: true}
生成器函数有一个有趣的特点,每当执行完一条 yield 语句,函数就会停下来。知道再次调用迭代器的 next 方法,就会继续执行到下一个 yield 语句。这种中止函数执行的特性让生成器有很多有趣的应用,这些应用会在下文中涉及。
注意,yield 的使用限制:yield 关键字只能在生成器内部使用,在其他地方使用则会导致语法错误,即使是在生成器内部的函数使用也会报错。
function *createIterator(items) {
items.forEach((item) => {
yield item; // Wrong~ 这样会报错的哦!
})
}
生成器的函数表达式写法
(待续)