这是我参与「第四届青训营 」笔记创作活动的的第9天。
迭代器和生成器:
1.for循环就是简单的迭代
for(let i=0;i<l.length;i++){
console.log(l[i]);
}
缺点:
- 迭代前需要知道指定的数据结构
- 遍历顺序不是数据结构固有的
迭代器模式可以解决这个问题。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 }
\