ES6迭代器和生成器-简单学习

781 阅读2分钟

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

  1. 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

  1. 当使用扩展运算符 (...) 或者对数组和 Set 结构进行解构赋值时 , 会调用 Symbol.iterator 方法

生成器

1.概念

  • Generator 函数是ES6 提供的一种异步编程解决方案 , 语法行为与传统函数完全不同
  • 语法上 , 首先可以把它理解成 , Generator 函数是一个状态机 ,封装了多个内部状态
  • Generator 函数除了状态机 , 还是一个遍历器对象生成函数