可迭代对象 Iterable object

一. 概念

  1. 内建可迭代对象 : 即自带有迭代接口 [Symbol.iterator] 的 Array , Arguments ,  Set,  Map ,  String,  TypeArray,  Nodelist 等,内建支持 for ... of 迭代形式的对象

    for...of... 详情见 : for...of - JavaScript | MDN (mozilla.org)

  2. 迭代器 : 对于普通对象,如果需要用到 for ... of ... 进行迭代,需要为其手动添加方法 [Symbol.iterator] , 方法内部必须返回一个 迭代器(iterator)即:一个有 next ()方法的对象。

  3. next返回值 : next() 方法的返回结果必须是 { value : any , done : boolean } 的形式 , 当next()返回值为done = true时即停止迭代 ,否则一直迭代下去

 

二. 添加迭代器接口 : 

  1. 对象自身没有 [Symbol.iterator] 接口,需要手动添加

//1. 创建一个对象
let num= {
  start: 1,
  end: 5
};

//2. 为自建对象添加方法
num[Symbol.iterator] = function() {

//3. 该方法返回一个包含next()方法的对象,即迭代器对象
  return {
    current: this.start,
    last: this.end,
    
    //4. next()的返回值必须符合形式
    next() {
      //4.1 循环时迭代输出当前值++ ,直到current>end迭代结束
      if (this.current <= this.last) {
        return { done: false, value: this.current++ };
      } else {
        return { done: true };
      }
    }
  };
};

//调用for...of...时会进入[Symbol.iterator]方法,循环迭代current++
for (let number of num) {
  console.log(number); // 1, 2, 3, 4, 5
}

  

  2. 迭代器对象 和 迭代对象 是区分开来的,也可以利用迭代对象自身作为迭代器对象

let num= {
  start: 1,
  end: 5,

  [Symbol.iterator]() {
    this.current = this.start;
    // 返回对象自身---包含next()方法的迭代对象作为迭代器对象
    return this;
  },
  
  // 当前迭代对象添加一个next()方法,且符合返回值形式  
  next() {
    if (this.current <= this.end) {
      return { done: false, value: this.current++ };
    } else {
      return { done: true };
    }
  }
};

for (let number of num) {
  console.log(number); // 1, 2, 3, 4, 5
}

  但是此时迭代对象利用自身作为迭代器对象,因为他们两个会共享迭代状态,因此迭代过程中不能不能同时存在for...of...的两个迭代

  

  3. 显示调用迭代器 : 对于自带[Symbol.iterator] 接口的对象,例如字符串,可以手动拆分其迭代过程,使迭代过程中可以进行更多操作

let str = "Hello World";

// 1. 手动获取调用其迭代接口,相当于对其进行一次 for...of...操作
let iterator = str[Symbol.iterator]();

while (true) {
  // 2. 手动调用迭代接口的next()方法进行输出
  let result = iterator.next();

  // 3. 迭代完毕则停止循环
  if (result.done) break;

  // 循环过程中手动控制迭代,有利于进行一些其它操作
  console.log(result.value);
}

 

posted @ 2022-06-16 13:29  JOJOLai  阅读(56)  评论(0编辑  收藏  举报