Introduction

Iterator is one of the most common design modes in daily development. Let's explore the iterator continent in the javacript world, here we go!

Gist Iterator Mode

It's the basic iterator mode concept:



And it's like this in javascript world:

Grammar rules

Attention

Assume that "iterable" is an adjective, and "iterableFn" is a iterable.

It's a little confusing when lots of "iterable" appear at the same time.

Relation between iterable and iterator

Iterator can be created by iterableFn(an iterable), iterableFn belongs to iterable sources.

Iterables

Iterable sources

  • Array
  • String
  • Map
  • Set
  • Dom Elements
  • Arguments

Get iterableFn(used to generate iterator)

IterableFn can be derived from iterable source by its property: Symbol.iterator, for example: const iterableFn = [][Symbol.iterator]

Symbol.iterator

A method that returns the default Iterator for an object. Called by the semantics of the for-of statement.

/** Test in chrome 55  **/
// Array
console.log( [][Symbol.iterator] ) // function values() { [native code] } // String
console.log( ''[Symbol.iterator] ) // function [Symbol.iterator]() { [native code] } // Map
console.log( new Map([[]])[Symbol.iterator] ) // function entries() { [native code] } // Set
console.log( new Set([])[Symbol.iterator] ) // function values() { [native code] } // Dom elements
console.log( document.getElementsByTagName('body')[Symbol.iterator] ) // function values() { [native code] } // arguments
function test() {
console.log( arguments[Symbol.iterator] )
}
test(1, 2, 3) // // function values() { [native code] }

Iterable sources' consumers

Follow consumers' implementations mainly depend on iterables.Howerver, the examples are irrelevant to topic.

  • for of
for(const i in [1, 2]) {
cosnole.log(i)
}
// 1
// 2
  • ...(The spread opeartor)
console.log( [..."ab"] )     // ["a", "b"]
  • Array.from
console.log( Array.from("ab") )    // ["a", "b"]

Iterators

Iterator is common used, as to decouple algorithms.

Iterator = iterableFn()

After iterable's implementation, it returns an object called iterator, which uses "next" method to iterate.

/** Test in chrome 55  **/
// Array
console.log( [][Symbol.iterator]() ) // ArrayIterator {} // String
console.log( ''[Symbol.iterator]() ) // StringIterator {} // Map
console.log( new Map([[]])[Symbol.iterator]() ) // MapIterator {[undefined, undefined]} // Set
console.log( new Set([])[Symbol.iterator]() ) // SetIterator {} // Dom elements
console.log( document.getElementsByTagName('body')[Symbol.iterator]() ) // ArrayIterator {} // arguments
function test() {
console.log( arguments[Symbol.iterator]() )
}
test(1, 2, 3) // ArrayIterator {}

Add value and Implement method "next":

/** Test in chrome 55  **/
// Array
console.log( [1, 2][Symbol.iterator]().next() ) // {value: 1, done: false} // String
console.log( 'ab'[Symbol.iterator]().next() ) // {value: 'a', done: false} // Map
console.log( new Map([[1, 'a']])[Symbol.iterator]().next() ) // {value: [1, 'a'], done: false} // Set
console.log( new Set([1, 1, 2])[Symbol.iterator]().next() ) // {value1: , done: false} // Dom elements
console.log( document.getElementsByTagName('body')[Symbol.iterator]().next() ) // {value: body(dom), done: false} // arguments
function test() {
console.log( arguments[Symbol.iterator]().next() )
}
test(1, 2, 3) // {value: 1, done: false}

Iterator = generator()

Setting iterator mutually again and again seems inefficient, syntactic sugar is needed. Fortunately, ES6 provides the useful "generater"

function* iteratorMaker() {
yield 1
yield 2
} const iterator = iteratorMaker() console.log( iterator ) // iteratorMaker {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window, [[GeneratorLocation]]: Object} console.log( iterator.next() ) // {value: 1, done: false} console.log( iterator.next() ) // {value: 2, done: false} console.log( iterator.next() ) // {value: undefined, done: true}

Application

Iterator can be applied in wide situations, there's a sample to generate increasing id numbers.

function* idIteratorMaker() {
let id = 0
while (true) {
yield id++
}
} function create(idIterator) {
return idIterator.next().value
} const idIterator = idIteratorMaker() const a = create(idIterator)
const b = create(idIterator)
const c = create(idIterator) console.log(a) // 0
console.log(b) // 1
console.log(c) // 2

Conclusion

Obviously, iterator makes codes more readable and matainable.

Reference

  1. http://exploringjs.com/es6/ch_iteration.html#sec_iterating-language-constructs
  2. https://tc39.github.io/ecma262/#table-1

Gist - ES6 Iterator的更多相关文章

  1. ES6—— iterator和for-of循环

    Iterator 遍历器的作用:为各种数据结构,提供一个同意的,简便的访问接口.是的数据结构的成员能够按某种次序排列.ES6 新增了遍历命令 for...of 循环,Iterator接口主要供 for ...

  2. es6 -- Iterator 和 for...of 循环

    1:Iterator(遍历器)的概念 JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就有了四种数据集合,用户还 ...

  3. es6 Iterator和for...of循环

    javascript表示集合的数据结构有 es5: array object es6: map set, 一共4种数据集合 需要一种统一的接口机制来处理所有不同的数据结构 遍历器就是这样一种机制,它是 ...

  4. Gist - ES6 Proxy

    Introduction "Proxy" is a frequently used pattern in both virtual world and real world. Th ...

  5. ES6 iterator 迭代器

    iterator使用TypeScript 的描述: interface Iterable { [Symbol.iterator]() : Iterator, } interface Iterator ...

  6. ES6(Iterator 和 for...of 循环)

    Iterator 和 for...of 循环 1.什么是 Iterator 接口 Iterator 接口功能:用一种相同办法的接口让不同的数据结构得到统一的读取命令的方式 2.Iterator的基本用 ...

  7. Gist - ES6 Promise

    The concept of "Promise" Promise is used to asynchronous computations. Introduction " ...

  8. ES6 Iterator

    不同数据集合怎么用统一的方式读取 可以用for...of循环了

  9. nodejs入门API之url模块+querystring模块

    关于URL的一些基础内容 URL模块的API解析 URL的参数URLSearchParams类 querystring模块 一.关于URL的一些基础内容 1.1 定义: 在WWW上,每一信息资源都有统 ...

随机推荐

  1. ActiveXObject函数详解(转自http://eyesinthesky.iteye.com/blog/1560033)

    什么是 ActiveX 控件? ActiveX 控件广泛用于 Internet.它们可以通过提供视频.动画内容等来增加浏览的乐趣.不过,这些程序可能出问题或者向您提供不需要的内容.在某些情况下,这些程 ...

  2. linux下vim编辑器使用

    VIM - Vi IMproved: vim是vi编辑器的升级版,是linux下标准的编辑器,具有程序编写能力,可以根据字体颜色辨别语法的正确性,方便程序的设计. 使用: # vim [OPTION] ...

  3. sublime设置 快捷键(自动换行)

    一.菜单view > word wrap选上就好了 二.如果让编辑器默认是自动换行的话把它保存到配置中 Preference > Settings-User插入以下一行配置 "w ...

  4. Python ORM框架之 Peewee入门

    之前在学Django时,发现它的模型层非常好用,把对数据库的操作映射成对类.对象的操作,避免了我们直接写在Web项目中SQL语句,当时想,如果这个模型层可以独立出来使用就好了,那我们平台操作数据库也可 ...

  5. Tomcat8-源码编译及开发

    前言 下载Tomcat8源码进行分析,最好的方式,可以编译及运行,从网上查询了很多方式,总是不能完整的运行,由于本人采用idea编辑器,所以喜欢maven的方式,所以综合了网上的多种方案,最终可以在i ...

  6. .Net程序员学用Oracle系列(29):PLSQL 之批量应用和系统包

    1.批量数据操作 1.1.批量生成数据 1.2.批量插入数据 2.批量生成脚本 3.生成数据字典 4.常见系统包 4.1.DBMS_OUTPUT 4.2.DBMS_RANDOM 4.3.其它系统包及常 ...

  7. 解决selenium驱动Firefox跳转页慢慢慢的问题

    首先我给自己定义为是一个更新偏执狂.不知道从哪个版本开始,使用selenium驱动打开Firefox浏览器时,会跳转到官网指定页,这个过程真是慢得要死. 为了解决这个问题,我是查了很多资料,解决方案是 ...

  8. 利用EF ORM Mysql实体运行程序出错解决方案

    程序环境:VS2013 + mysql (server 5.7 + connector net 6.9.9 + for visual studio 1.2.6) + entity framework ...

  9. while循环 操作列表与字典

    1.在列表间移动元素 #!/usr/bin/env python #filename=list.py num1 = [1,3,5,7,9,11,13,15] num2 = [] while num1: ...

  10. springboot 集成elasticsearh的简单配置

    添加依赖 gradle compile("org.springframework.boot:spring-boot-starter-data-elasticsearch:${springBo ...