首页 > 其他分享 >Iterator

Iterator

时间:2022-10-19 21:49:00浏览次数:42  
标签:... return Iterator iterator value next done

Iterator的概念
遍历器的遍历过程:

  1. 创建一个指针对象,指向当前数据结构的起点。
  2. 不断调用指针对象next方法指向下一个成员
  3. 每次调用时会返回{value:xxx,done:bool}的对象
  4. 默认值为done:false,value:undefined
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
function makeIterator(array) {
  var nextIndex = 0;
  return {
    next: function() {
      return nextIndex < array.length ?
        {value: array[nextIndex++], done: false} :
        {value: undefined, done: true};
    }
  };
}

将一个对象变成可遍历的:

const obj={
    [Symbol.iterator]:function(){
        return {
            next:function(){
                return {
                    value:1,
                    done:true
                }
            }
        }
    }
}

注意一个类数组对象可以这样使用:

let iterable = {
  0: 'a',
  1: 'b',
  2: 'c',
  length: 3,
  [Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable){
    console.log(item);
}
//普通对象不行
let iterable={
    a:'a',
    b:'b',
    c:'c',
}

调用Iterator接口的场合:

  1. 解构赋值:对数组和Set解构赋值时默认调用Symbol.iterator方法
  2. 扩展运算符...会调用默认的Iterator接口.[...str]
  3. yield*
//yield*后面跟着可遍历结构,也会调用遍历器接口。
let generator=function*(){
    yield 1;
    yield*[2,3,4];
    yield 5;
};
var iterator=generator();
iterator.next(); 

字符串的Iterator接口:
通过覆盖原生Symbol.iterator方法可以修改遍历器行为,迭代器的实现需要结合Generator函数上.

除了配置迭代器方法还可以使用return方法,return在for...of循环提前退出时调用:

function readLinesSync(file) {
  return {
    [Symbol.iterator]() {
      return {
        next() {
          return { done: false };
        },
        return() {
          file.close();
          return { done: true };
        }
      };
    },
  };
}

for...of循环可以循环数组,Set和Map结构类似数组对象(如argument对象,DOM的NodeList对象,以及后文中的Generator对象及字符串),均具有Symbol.iterator
(PS:for...in...只能获取对象的键名,不能获取键值)

//对于数组迭代器来说for...of只可以返回数字索引的属性
let arr = [3, 5, 7];
arr.foo = 'hello';
for (let i in arr) {
  console.log(i); // "0", "1", "2", "foo"
}
for (let i of arr) {
  console.log(i); //  "3", "5", "7"
}

使用Array.from将类数组对象转为数组之后就可以使用迭代器了。
forEach的缺点就是不能使用break,continue,return等.

标签:...,return,Iterator,iterator,value,next,done
From: https://www.cnblogs.com/mengyiqwq/p/16807856.html

相关文章

  • Iterator迭代器
    Iterator迭代器的概述Iterator接口也是java集合中的一员但他与Collection、map接口有所不同所属与java.util包下Collection接口与Map接口主要用于存储元素而Iterator主......
  • Collection集合存储学生对象并遍历(用迭代器Iterator遍历)
    packagepackage4;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassStudentTest{publicstaticvoidmain(......
  • Java Iterator(迭代器)
    importjava.util.ArrayList;importjava.util.Iterator;/***JavaIterator(迭代器)*JavaIterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代ArrayList......
  • 迭代器Iterator
    学集合之前我们先来学习迭代器?那什么是迭代器。迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每......
  • 迭代器模式 Iterator
    “数据结构”模式常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提......
  • 迭代器iterator在程序到底起什么作用? ——整理
    1.类似于一个指针,但不是指针2.在container中相当于指向element的指针,但其实现并不是指针,而是对象。 3.从大的方面讲是容器和算法之间的黏合剂从小的方面讲是类似智能指针......
  • Java: Iterator/Cursor Patterns
    /***版权所有2022涂聚文有限公司*许可信息查看:*描述:*迭代器模式Iterator/CursorPatterns*历史版本:JDK14.02*2022-09-12创建者geovindu*2022......
  • C#教程 - 枚举器 & 迭代器(IEnumrator & Iterator)
    更新记录转载请注明出处:https://www.cnblogs.com/cqpanda/p/16691006.html2022年9月19日发布。2022年9月10日从笔记迁移到博客。枚举器(Enumerator)枚举器和可枚举......
  • Java中Iterator和ListIterator用法整理
    1 迭代器简介(Iterator)迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建......
  • 34 | JAVA集合遍历帮手Iterator(不暴露集合的一种封装)
    IteratorJava的集合类都可以使用foreach循环,List、Set和Queue会迭代每个元素,Map会迭代每个key。以List为例:List<String>list=List.of("Apple","Orange","Pear");f......