ES6 Iterator 迭代器

一、Iterator简介

1.Iterator概述

JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set。遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作。

2.Iterator作用

Iterator作用有三个:

  • 为各种数据结构,提供统一的、简便的访问接口
  • 使数据结构的成员能按照某种次序排序
  • ES6 创造了一种新的遍历命令for…of循环,Iterator 接口主要供for…of消费。

3.迭代过程

  • 通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置
  • 随后通过 next 方法进行向下迭代指向下一个位置, next 方法会返回当前位置的对象,对象包含了 value 和 done 两个属性, value 是当前属性的值, done 用于判断是否遍历结束
  • 当 done 为 true 时则遍历结束

4.原生具备Iterator接口的数据结构

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的 arguments 对象
  • NodeList 对象

5.Symbol.iterator属性

一个数据结构只要部署了Symbol.iterator属性,就被视为具有 iterator 接口

二、Iterator用法

1.基本用法

const items = ["zero", "one", "two"];
const it = items[Symbol.iterator]();
 
it.next();
>{
    
    value: "zero", done: false}
it.next();
>{
    
    value: "one", done: false}
it.next();
>{
    
    value: "two", done: false}
it.next();
>{
    
    value: undefined, done: true}

2.自定义遍历器对象的 return(),throw()

return()方法的使用场合是,如果for…of循环提前退出(通常是因为出错,或者有break语句),就会调用return()方法。如果一个对象在完成遍历前,需要清理或释放资源,就可以部署return()方法。

function readLinesSync(file) {
    
    
  return {
    
    
    [Symbol.iterator]() {
    
    
      return {
    
    
        next() {
    
    
          return {
    
     done: false };
        },
        return() {
    
    
          file.close();
          return {
    
     done: true };
        }
      };
    },
  };
}

下面的两种情况,都会触发执行return()方法。

// 情况一
for (let line of readLinesSync(fileName)) {
    
    
  console.log(line);
  break;
}

// 情况二
for (let line of readLinesSync(fileName)) {
    
    
  console.log(line);
  throw new Error();
}

三、for…of循环

for…of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。

1.数组

JavaScript 原有的for…in循环,只能获得对象的键名,不能直接获取键值。ES6 提供for…of循环,允许遍历获得键值。

var arr = ['a', 'b', 'c', 'd'];

for (let a in arr) {
    
    
  console.log(a); // 0 1 2 3
}

for (let a of arr) {
    
    
  console.log(a); // a b c d
}

猜你喜欢

转载自blog.csdn.net/qq_41466440/article/details/112647188