Js迭代器简介

  1. 迭代器是什么
  2. 工作原理

迭代器是什么

迭代器(iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署iterator接口,就可以完成遍历操作。

ES6创造了一种新的遍历命令for of循环,iterator主要供for of使用。

原生具备了iterator接口的数据结构:

  • Array
  • Arguments
  • Set
  • Map
  • String
  • TypedArray
  • NodeList

工作原理

  1. 创建一个指针对象,指向当前数据结构的起始位置;
  2. 第一次调用对象的next方法,指针自动指向数据结构的第一个成员;
  3. 接下来不断不断调用next方法,指针一直往后移,直到指向最后一个成员;
  4. 每次调用next方法放回一个包含valuedone属性的对象;

注意 需要自定义遍历数据的时候,记得享到使用迭代器

let obj = {
  name: 'xiaoming',
  age: 18,
  arr: [1,2,3,4]
}

现在我们需要拿到obj对象里的arr数组的数据。

由于Object并没有内置iterator,所以我们使用for of遍历时,控制台报错,现在我们给obj对象加入iterator

let obj = {
  name: 'xiaoming',
  age: 18,
  arr: [1,2,3,4],
  [Symbol.iterator(){
    let index = 0;
    let _this = this;
    return {
      next: function(){
        if(index < _this.arr.length>) {
          const result  = {
            value: _this.arr[index++],
            done: false
          };
          index++
          return result;
        } else{
          return {
            value: undefined,
            done: true
          }
        }
      }
    }
  }]
}

for(value of obj){
  console.log(value)
}
// 1,2,3,4

iterator接口的目的,就是为所有数据结构提供一种统一的访问机制,即for of循环,那么就需要实现一个统一的,默认的iterator接口:Symbol.iterator

可以理解为: 一个对象只要具有Symbol,iterator属性,就可以认为是一个可迭代对象。

Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数,执行这个函数,就回返回一个迭代器对象。至于函数名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为Symbol的特殊值,所以要放在方括号内。

let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();

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

参考


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 chaoyumail@126.com

×

喜欢就点赞,疼爱就打赏