迭代器和生成器(一) | 青训营笔记

69 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第9天。

迭代器和生成器:

1.for循环就是简单的迭代
for(let i=0;i<l.length;i++){
    console.log(l[i]);
}

缺点:

  1. 迭代前需要知道指定的数据结构
  2. 遍历顺序不是数据结构固有的

迭代器模式可以解决这个问题。JavaScript在ECMAScript6支持。

2.迭代器模式

它描述了一个方案,即可以把有些结构称为”可迭代对象”(iterable),因为他们实现了Iterable接口,而且可以通过迭代器Iterable消费。

3.可迭代协议

实现Iterable接口(可迭代协议)要求同时具备两种能力,支持迭代的自我识别能力和创建实现Iterator接口的能力。

这个属性使用特殊的Symbol.iterator作为键,他是一个迭代工厂函数,会返回一个新的迭代器。

许多的内置类型都实现了Iterable接口:

  • 字符串
  • 数组
  • 映射
  • 集合
  • arguments对象
  • NodeList等DOM集合类型
通过打印一种类型的Symbol.iterator属性可以判断它是否实现了迭代器的工厂函数

其实我们在写代码的时候,我们也没有显式的调用工厂函数生成迭代器,可以接受迭代的原生语言特性包括:

  • for-of循环
  • 数组解构
  • 扩展运算符
  • Array.from()
  • 创建集合
  • 创建映射
  • Promise.all()接收由期约组成的可迭代对象
  • Promise.race()接收由期约组成的可迭代对象
  • yield* 操作符,在生成器中使用
4.迭代器协议

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

let arr = ['A','B','C'];
let itr = arr[Symbol.iterator]();
console.log(itr);//Object [Array Iterator] {}
console.log(itr.next());//{ value: 'A', done: false }  done代表是否可以不在可以用next()取得下一个值,若是true为耗尽
console.log(itr.next());//{ value: 'B', done: false }  value包含可迭代对象的下一个值
console.log(itr.next());//{ value: 'C', done: false }
console.log(itr.next());//{ value: undefined, done: true }

\