迭代器&生成器
ECMAScript6 规范新增了两个高级特性:迭代器和生成器。使用这两个特性,能够更清晰、搞笑、方便的实现迭代。
迭代
概念:按照顺序反复多次执行一段程序,通常会有明确的终止条件.
- 循坏是迭代的基础
- 迭代会在一个有序集合上进行
迭代器(iterator)
迭代器:是一个对象,它定义一个序列,并在终止时可能返回一个返回值。更具体地说,迭代器是通过使用next()
方式实现Iterator protocol
的任何对象,该方法返回具有两个属性的对象:value
和done
简单迭代器示例
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
: 包含可迭代对象的下一个值(done
为false
),或者undefined
(done
为true
)
可迭代协议
可迭代对象
内置类型时间了Iterable接口:
- 字符串String
- 数组Array
- 映射Map
- 集合Set
- arguments对象
- NodeList等DOM集合类型
接收可迭代对象的原生语言特性包括:
- for-of循坏
- 数组解构
- 扩展操作符
- Array.from()
- 创建集合
- 创建映射
- Promise.all()
- Promise.race()
- yield* 操作符