Iterator 遍历器

1、遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

2、Iterator的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。

3、在ES6中,有些数据结构原生具备Iterator接口(比如数组),即不用任何处理,就可以被for...of循环遍历,有些就不行(比如对象)。原因在于,这些数据结构原生部署了Symbol.iterator属性(详见下文),另外一些数据结构没有。凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。调用这个接口,就会返回一个遍历器对象。

4、在ES6中,有三类数据结构原生具备Iterator接口:数组、某些类似数组的对象、Set和Map结构。

5、一个为对象添加Iterator接口的例子。

let obj = {
  data: [ ‘hello‘, ‘world‘ ],
  [Symbol.iterator]() {
    const self = this;
    let index = 0;
    return {
      next() {
        if (index < self.data.length) {
          return {
            value: self.data[index++],
            done: false
          };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

6、下面是类似数组的对象调用数组的Symbol.iterator方法的例子。

let iterable = {
  0: ‘a‘,
  1: ‘b‘,
  2: ‘c‘,
  length: 3,
  [Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
  console.log(item); // ‘a‘, ‘b‘, ‘c‘
}

注意,普通对象部署数组的Symbol.iterator方法,并无效果。

7、有一些场合会默认调用Iterator接口(即Symbol.iterator方法),除了下文会介绍的for...of循环,还有几个别的场合。

  • 解构赋值
  • 扩展运算符(...)
  • yield*_yield*后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口。
  • 由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用

8、字符串是一个类似数组的对象,也原生具有Iterator接口。

9、遍历器对象除了具有next方法,还可以具有return方法和throw方法。如果你自己写遍历器对象生成函数,那么next方法是必须部署的,return方法和throw方法是否部署是可选的。

原文地址:https://www.cnblogs.com/airen123/p/9543655.html

时间: 2024-10-04 15:07:17

Iterator 遍历器的相关文章

遍历器 for...of 循环

for...of 作为遍历所有数据结构的统一的方法,但不能直接遍历对象,因为没有 Symbol.iterator 遍历器接口 (所以可用 Object.keys( ) / Object.values( ) 去转一道,转成数组就可以用了.或者给obj [ Symbol.iterator ] = function( ){ ... }) ary.key( )  拿到数组的下标 value( )  拿到的是数组的每个值 entries( )  拿到的是:[ 下标,值 ]  这个样的一个形式的所有的数据.

C++迭代器/遍历器 iterator实现

1.原理 迭代器又称为遍历器,用于访问容器中的数据,迭代器旨在算法和容器之间搭建访问的桥梁,从而使算法和数据分离,不用关心数据具体的存储细节.具体的原理描述请参考以下两个博客: [1].C++迭代器 iterator [2].Iterator模式C++实现 迭代器的UML图: (来自:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/25/1764934.html) 2.实现 根据以上的原理图,下面实现一个简单的迭代器. /* * 以下实现了

Iterator接口(遍历器)和for/of循环

只要某个数据结构部署了Iterator接口,就可以使用拓展运算符将其转化为数组. let arr = [...iterator]; var str = 'hello'; [...str] //["h", "e", "l", "l", "o"] yield* 后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口. let generator = function* (){ yield 1; yield* [

第十二章 遍历器

遍历器(Iterator)的作用是按照指定的顺序来访问一个集合中的所有元素,而不需要了解集合的详细数据结构. 1 概述 1.1 foreach语句 这种遍历方式对任何类型的数据都适用,因为所有数组都继承了.NET类库中定义的类System.Array,而该类继承了接口IEnmerable.在C#中,如果某个类型继承了接口IEnumerable,或者继承了泛型接口IEnumerable<T>,或者继承了泛型接口IEnumerable<T>的任何一个构造类型,那么称该类型是“可枚举的”

遍历器接口

Symbol是种新的数据类型,表示独一无二,通常用于定义对象的属性名,[Symbol()].一.什么是遍历器接口?一个数据结构有遍历器接口的特征是:它有Symbol.iterator属性,它有next()方法,返回一个包含value和done属性的对象.原生具备遍历器接口的数据结构:Array,Map,Set,String,TypedArray,函数的arguments对象,NodeList对象. //遍历数组 const arr = [1,2,3,4,5]; var a = arr[Symbo

ES6遍历器 生成器 学习整理

遍历器[迭代器](Iterator) 就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员). Iterator 的作用有三个: 1.是为各种数据结构,提供一个统一的.简便的访问接口: 2.是使得数据结构的成员能够按某种次序排列: 3.是 ES6 创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of消费. 示例代码: //迭代器示例 functi

for、foreach和Iterator遍历有什么(效率)区别

(问:1.for.foreach和Iterator遍历有什么区别    2.遍历删除ConcurrentModificationException异常.) 1.在形式上 for的形式是 for(int i=0;i<arr.size();i++){...} foreach的形式是 for(int i:arr){...} iterator的形式是 Iterator it = arr.iterator(); while(it.hasNext()){ object o =it.next(); ...}

Iterator遍历 (遍历集合)

迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元素.注意:iterator()方法是java.lang.Iterable接口,被Collection继承. (2)

&lt;s:iterator&gt;遍历map=new TreeMap(string,Map(string,User))

//嵌套遍历,先给外层的map(假设是放在root中的,如果放在context的map中,要加#)取个别名,放到Actioncontext中 <s:iterator value="map" var="mar"> //当map被放到iterator之后,每遍历一个元素,就临时将其放到栈顶,所以可以直接取值 //这个value就是外层map的值,也就是里层的map <s:iterator value="value"> //每次