迭代器

Iterator(迭代器)

  1. 定义: 是一个对象,用来帮助我们遍历某一个数据结构
  2. 标准[迭代器协议(iterator protocol)]:
    (1) 必须有一个next函数,并且该函数没有参数或者只有一个参数
    (2) next函数必须返回一个对象,并且该对象里包含done和value属性
    done 属性: 遍历的每一个属性,赋值为false,遍历完成全部属性后,最后会再访问一次,赋值为true,对应value属性的undefined
    value属性: 遍历的每项的值,全部的值遍历完成后,最后会再访问一次,生成一个undefined的值对应 done:true
     const arr=[1,2,3,4,5]
    let index=0
    const iterObj={
      next() {
        if(index>=arr.length) {
          return {done: true,value: undefiend}
        } else {
          return {done: false,value: arr[index++]}
        }
      }
    }
    console.log(iterObj.next()) --> {done: false, value: 1}
    console.log(iterObj.next()) --> {done: false, value: 2}
    console.log(iterObj.next()) --> {done: false, value: 3}
    console.log(iterObj.next()) --> {done: false, value: 4}
    console.log(iterObj.next()) --> {done: false, value: 5}
    console.log(iterObj.next()) --> {done: true, value: undefined}

    备注:如果done一直不为true,那么这个迭代器就是无限迭代器(使用较少)

可迭代对象

  1. 定义: 当一个对象实现了iterable protocol(可迭代协议)时,它就是一个可迭代对象
  2. 标准[ 可迭代协议]:
    (1) 必须实现一个[Symbol.iterator]函数
    (2) 该函数必须返回一个迭代器
const interableObj={
  names: [1,3,5],
  [Symbol.iterator]() {
    let index=0
    return {
      next: () => {
        if(index<this.names.length) {
          return {done: false,value: this.names[index++]}
        } else {
          return {done: true,value: undefined}
        }
      }
    }
  }
}
console.log(interableObj[Symbol.iterator]().next())-->{done: false,value: 1}

注意: for..of..就是调用next函数循环调用的语法糖

应用场景

  1. for..of..语法糖
  2. 展开运算符(对象的展开不是迭代器,而是新的一个语法,因为对象不是可迭代对象)
  3. 解构(对象的解构不是迭代器,而是新的一个语法,因为对象不是可迭代对象)
  4. new Set( ),Array.from( ),promise.All( )传递的参数都得是可迭代对象

自定义类可迭代对象

  1. 可以在类里面直接创建[Symbol.iterator]函数
    class ClassRom{
      constructor(){}
      
      [Symbol.iterator](){
          return {
              next:() =>{
                  return { done:false, value:'a' }
              },
              /* 迭代终止时的提示 */
              return: ()=>{
                  console.log( '迭代器终止了~' )
                  return { done:true, value: undefined }
              }
          }
      }
    }

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!