跳到主要内容

迭代器&生成器

ECMAScript6 规范新增了两个高级特性:迭代器和生成器。使用这两个特性,能够更清晰、搞笑、方便的实现迭代。

迭代

概念:按照顺序反复多次执行一段程序,通常会有明确的终止条件.

  • 循坏是迭代的基础
  • 迭代会在一个有序集合上进行

迭代器(iterator)

迭代器:是一个对象,它定义一个序列,并在终止时可能返回一个返回值。更具体地说,迭代器是通过使用next()方式实现Iterator protocol的任何对象,该方法返回具有两个属性的对象:valuedone

简单迭代器示例
function makeIterator(array) {
let nextIndex = 0;
return {
next: function () {
return nextIndex < array.length ? {
value: array[nextIndex++],
done: false
} : {
done: true
}
}
};
}
let it = makeIterator(['zhangsan', 'lisi', 'wanger']);
console.log(it.next()) // { done: false, value: 'zhangsan' }
console.log(it.next()) // { done: false, value: 'lisi' }
console.log(it.next()) // { done: false, value: 'wangwu' }
console.log(it.next()) // { done: true, value: undefined }

迭代器协议

迭代器是一种一次性使用的对象,用于迭代与其关联的可迭代对象。迭代器API使用next()方法在可迭代对象中遍历数据。每次成功调用next(),都会返回一个IteratorResult对象,其中包含迭代器返回的下一个值。若不调用next(),则无法知道迭代器的当前位置。

IteratorResult对象:

  • done: 是一个布尔值。表示是否还可以再次调用next()取的下一个值
  • value: 包含可迭代对象的下一个值(donefalse),或者undefined(donetrue)

可迭代协议

可迭代对象

内置类型时间了Iterable接口:

  • 字符串String
  • 数组Array
  • 映射Map
  • 集合Set
  • arguments对象
  • NodeList等DOM集合类型

接收可迭代对象的原生语言特性包括:

  • for-of循坏
  • 数组解构
  • 扩展操作符
  • Array.from()
  • 创建集合
  • 创建映射
  • Promise.all()
  • Promise.race()
  • yield* 操作符

生成器(generator)