ES6 迭代器和生成器
js 原生的表示 集合的数据结构 , 主要是数组 和 对象, es6 又添加了 map 和 set. 迭代器 (Iterator) 就是这样一种机制。 它是一种接口 ,为各种不同的数据结构提供统一的访问机制。
任何数据结构只要部署 Iterator 接口,就可以完成遍历操作
迭代器
Iterator 的作用
- 为各种数据结构 , 提供一个统一的,简便的访问接口
- 使得数据结构的成员能够按某种次序排列
- ES6创造了一种新的遍历命令 for-of 循环, Iterator 接口主要提供 for-of 消费
原生具备 iterator 接口的数据(可用 for-of 遍历)
- Array
- set容器
- map容器
- String
- 函数的 arguments对象
- NodeList 对象
迭代器的工作原理
- 创建一个指针对象 , 指向数据结构的起始位置
- 第一次调用 next 方法 , 指针自动指向数据结构的第一个成员
- 接下来不断调用 next 方法 , 指针会一直往后移动 , 直到指向最后一个成员
- 每调用 next 方法返回的是一个包含 value 和 done 的对象, { value : 当前成员的值 , done : 布尔值}
- value 表示
// 手写迭代器
function Iterator(arr) {
// 闭包
let nextIndex = 0;
return {
next : function() {
return nextIndex < arr.length ? { value : arr[nextIndex++] , done : false}
: { value : undefined , done : true }
}
}
}
let arr = [1,4, 'ads'];
let iteratorObj = Iterator(arr);
console.log(iteratorObj.next())
console.log(iteratorObj.next())
console.log(iteratorObj.next())
console.log(iteratorObj.next())
Note
- for-of 循环不支持遍历普通对象
var obj = {
name : 'hw'
}
for(let item of obj) {
console.log(item); // TypeError : obj is not iterable
}
对象的 Symbol.iterator 属性 , 指向该对象的默认遍历器方法。 当使用 for-of 去遍历某一个数据结构的时候 , 首先去找 Symbol.iterator , 找到了就去遍历 , 没有找到的话不能遍历 ,提示Uncaught TypeError: XXX is not iterable
- 当使用扩展运算符 (...) 或者对数组和 Set 结构进行解构赋值时 , 会调用 Symbol.iterator 方法
生成器
1.概念
- Generator 函数是ES6 提供的一种异步编程解决方案 , 语法行为与传统函数完全不同
- 语法上 , 首先可以把它理解成 , Generator 函数是一个状态机 ,封装了多个内部状态
- Generator 函数除了状态机 , 还是一个遍历器对象生成函数