es6 Iterator遍历器

本文详细介绍了遍历器(Iterator)的概念及其在ES6中的应用,包括Iterator的定义、作用、实现过程,以及其与Generator函数的关系。探讨了遍历器如何为不同数据结构提供统一的访问接口,使得数据成员能按特定顺序排列,并通过for...of循环进行遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是Iterator

遍历器(Iterator)它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

2.Iterator的作用

Iterator 的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是ES6创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of消费。

3.过程

(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。

(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。

(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。

(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。


var it = makeIterator(['a', 'b']);

it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }

function makeIterator(array) {
  var nextIndex = 0;
  return {
    next: function() {
      return nextIndex < array.length ?
        {value: array[nextIndex++], done: false} :
        {value: undefined, done: true};
    }
  };
}
/*
每一次调用next方法,都会返回数据结构的当前成员的信息。
具体来说,就是返回一个包含value和done两个属性的对象。
其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。
*/
复制代码

4.默认 Iterator 接口

一个数据结构只要具有Symbol.iterator属性,就可以认为是可遍历的。

const obj = {
  // Symbol是es6里一个特殊的类型,所以放在[]里。
  [Symbol.iterator] : function () { // Symbol.iterator是一个方法
    return { // 返回一个遍历器对象
      next: function () { // 遍历器对象具有next方法
        return { // 返回包含当前成员的对象
          value: 1,
          done: true
        };
      }
    };
  }
};

复制代码

原生具备Iterator接口的数据类型有Array,Map,Set,String,TypedArray,函数的 arguments 对象,NodeList 对象。

对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。

// 类数组对象要具有iterator接口,简单的办法是
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
// 或者
NodeList.prototype[Symbol.iterator] = [][Symbol.iterator];
复制代码

5.使用的场合

for ... of ...

数组的结构赋值

展开运算符 '...'

yield*

...

6.Iterator 接口与 Generator 函数

let myIterable = {
  [Symbol.iterator]: function* () {
    yield 1;
    yield 2;
    yield 3;
  }
}
[...myIterable] // [1, 2, 3]

// 或者采用下面的简洁写法

let obj = {
  * [Symbol.iterator]() {
    yield 'hello';
    yield 'world';
  }
};

for (let x of obj) {
  console.log(x);
}
// "hello"
// "world"
复制代码

7.return()方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值