Iterator

迭代器是一种一次使用的对象,里面有一个next( )方法,获取容器(可迭代对象)中的数据,同时指向下一个数据。

可迭代对象

  • string
  • array
  • map
  • set
  • arguments对象
  • NodeList等DOM集合类型 :::info 部署[Symbol.iterator]属性的对象,都具有可迭代的能力。这是一个工厂函数,可以识别可迭代的数据类型,并返回一个迭代器对象。 :::

    普通对象没有[Symbol.iterator]()接口,因为对象属性并没有顺序,遍历顺序是不确定的。

注释说明

image.png :::info 当你拿到一个容器的迭代器(泛化指针),迭代器指向容器的开始位置,然后获取数据传给算法,同时迭代器会自动指向下一个数据。这里的算法应该具有循环结构,就可以不断的执行迭代器,获取数据。 :::

[Symbol.iterator]

接口工厂函数,返回值是有next方法的对象。

  1. //重写迭代器接口函数1
  2. const arr1 = [1, 2, 3];
  3. arr[Symbol.iterator] = function () {
  4. let idx = 0;
  5. let len = this.length;
  6. let that = this;
  7. return { //迭代器工厂函数的返回值必须符合迭代器协议,也就是返回值是对象,且必须有next方法。
  8. next(){
  9. if(idx < len){
  10. idx++;
  11. return {value: that[idx - 1], done: false}
  12. }else{
  13. return {value: undefined, done: true}
  14. }
  15. }
  16. }
  17. }
  18. //重写迭代器接口函数2
  19. const arr2 = [1, 2, 3];
  20. arr2[Symbol.iterator] = function () {
  21. return [2, 3, 4, 5, 6][Symbol.iterator]();
  22. }
  23. //重写迭代器接口函数3,使用生成器函数。
  24. //生成器函数的返回值是符合迭代器协议。
  25. const arr3 = [1, 2, 3];
  26. arr3[Symbol.iterator] = function* generatorFn() {
  27. yield 1;
  28. yield 2;
  29. yield 3;
  30. }