迭代器在许多编程语言中被作为一种更易处理数据集合的方式被使用。在ECMAScript6中,JavaScript添加了迭代器,将其作为此语言的一个重要特征。当再加上新的方法和新的集合类型(比如集合与映射)时,迭代器对数据的高效处理变得更加重要。
什么是迭代器
迭代器不过是一个带有特定接口的对象。此接口由一个名为next()的返回一个结果对象的方法组成。该结果对象有两个属性,value,也就是next的值,还有done,一个布尔值,当没有更多的值要返回时就为true。迭代器保留了一个指向了值集合位置的内部指针,每次调用next(),返回下一个合适的值。
如果你在最后一个值被返回后调用next(),该方法返回的done是true,value包含了迭代器的返回值。返回值并不认为是数据集的一部分,而是相关数据的最终片段,或者如果不存在这样的数据就是undefined(这一概念在本章后面的生成器一节中会更加清晰)。
理解了这些,用ECMAScript5创建生成器就相当简单了,比如:
function createIterator(items) { var i = 0; return { next: function() { var done = (i >= items.length); var value = !done ? items[i++] : undefined; return { done: done, value: value }; } }; } var iterator = createIterator([1, 2, 3]); console.log(iterator.next()); // "{ value: 1, done: false }" console.log(iterator.next()); // "{ value: 2, done: false }" console.log(iterator.next()); // "{ value: 3, done: false }" console.log(iterator.next()); // "{ value: undefined, done: true }" // for all further calls console.log(iterator.next()); // "{ value: undefined, done: true }"
createIterator()函数在此例中返回了一个带有next()方法的对象。方法每次被调用时,items
数组中的下一个值会被作为value返回。当i为4时,items[i++]返回undefined且done为true,这满足了ECMAScript6中生成器特殊的最后一种情况。
ECMAScript6在许多地方利用了生成器,使数据集合更易处理。因此,有一个好的基本理解有助于你更好的从整体上理解这门语言。
生成器
//to be continue
生成器函数表达式
//to be continue
生成器对象方法
//to be continue
生成器类方法
//to be continue
可迭代对象和for-of
//to be continue
访问默认迭代器
//to be continue
创建可迭代对象
//to be continue
内置迭代器
//to be continue
集合迭代器
//to be continue
字符串迭代器
//to be continue
节点列表迭代器
//to be continue
高级功能
//to be continue
给迭代器传递参数
//to be continue
在迭代器中抛出错误
//to be continue
生成器返回语句
//to be continue
委托生成器
//to be continue
异步任务调度
//to be continue
总结
//to be continue