0
点赞
收藏
分享

微信扫一扫

Iterator 和 for ... of 循环

颜娘娘的碎碎念 2022-03-26 阅读 106

基本概念:

  • 在ES6中新增了Set和Map两种数据结构,再加上js之前原有的数组和对象,这样就有了四种数据集合,平时还可以组合使用他们,定义自己到的数据结构,比如数组的成员是Map,Map的成员是对象等。这样就需要一种统一的接口机制,来处理所有不同的数据结构
  • Iterator 就是这样一种极致。他是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作,二期二这种遍历操作是依次出里改数据结构的所有成员
  • Iterator 遍历器的作用:
    • 为各种数据结构,提供一个统一的,简便的访问接口
    • 似的数据结构的成员能够按某种次序排列
    • ES6新增了遍历命令for 。。。 of循环,Interator 接口主要供for…of消费

1、书写Iterator接口:

const arr = [1, 2, 3];
function interator(arr) {
    let index = 0;
    return {
        next(){
            return index < arr.length ? {value:arr[index++],done:false} :  {value:undefined,done:true}
        }
    }
}
const it = interator(arr);
console.log(it.next())//{ value: 1, done: false}
console.log(it.next())//{ value: 2, done: false}
console.log(it.next())//{ value: 3, done: false}
console.log(it.next())//{ value: undefined, done: false}

Iterator的遍历过程:

  • 创建一个指针对象,指向当前数据结构的起始位置,也就是谁,遍历器对象本质上就是一个指针对象。
  • 第一次调用指针对象的next方法,可以将指针指向是数据结构的第一个成员
  • 第二次调用真真对象的next方法,指针就指向数据结构的第二个成员
  • 不断调用指针对象的next方法,直到它指向数据结构的结束位置。
  • 每一次调用next方法,都会返回数据结构的当前成员的信息,具体来说,就是返回一个包含value 和 done两个属性的对象,其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束

2、凡是具有Symbol.iterator 属性的数据结构都具有Iterator接口

const arr = [1,2,3];
const set = new Set(arr);
const map = new Map([
    ["a",1]
]);

const itArr = arr[Symbol.iterator]();
const itSet = set[Symbol.iterator]();
const itMap = map[Symbol.iterator]();
console.log(itArr); //Object [Array Iterator] {}
console.log(itSet); // [Set Iterator] { 1, 2, 3 }
console.log(itMap); // [Map Entries] { [ 'a', 1 ] }

console.log(itSet.next()); // { value: 1, done: false }
console.log(itSet.next()); // { value: 2, done: false }
console.log(itSet.next()); // { value: 3, done: false }
console.log(itSet.next()); // { value: undefined, done: true }

const obj = {};
console.log(obj[Symbol.Iterator]); // undefined

3、距被Iterator接口的数据结构都可以进行如下操作:

  • 解构赋值
  • 使用for。。。of
  • 扩展运算符
举报

相关推荐

0 条评论