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. hdu4614 Vases and Flowers 线段树+二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0  到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...

  2. 服务器数据库挂掉 Can 't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock '(2) ";

    刚刚遇到这个报错,我无语了,我这么个菜逼,咋解决,还好师兄(付付)解决了,付付真棒,在此记录一下,以供学习 Can 't connect to local MySQL server through s ...

  3. 最近一些朋友问我,临近快毕业了专业不对口,想转行看到IT行业就业前景不错,但是编程语言众多不了解,不知道哪门语言能够快速入门掌握,短期能让我找到工作

    我做互联网前端后台开发也有四年多了,一路走过来,累并快乐着.快乐比艰辛更多,源自我的兴趣驱动.初中的一个偶然的机会我接触到了计算机,从那个时候就喜欢上开始经常到网吧上网.那个时候我对计算机领域的认识是 ...

  4. 瀑布流原生ajax,demo

    最近听朋友们说起瀑布流挺多的,自己就去研究下了,一个简单的原生demo,分享给大家... 简单分为三个文档,有详细的注释 img:ajax.php:demo.php 其中img中放入图片 1.jpg: ...

  5. 数组的重排序方法reverse()和sort()

    js数组中存在两个可以直接用来重排序的方法:reverse()和sort(). reverse()方法比较简单,直接反转数组项的顺序: var arr = [1, 3, 2, 4, 5]; arr.r ...

  6. iOS 关于UITableView的黑科技

      UITableView是我们最常用的控件了,今天我就来介绍一些关于UITableView的黑科技和一些注意的地方. 1.修改左滑删除按钮的高度   左滑删除这是iOS最先发明的,之后安卓开始模仿. ...

  7. FutureTask——另一种闭锁的实现

    关于多线程,我们接触对多的,最基础,入门的可能就是实现Runnable接口继承Thead类,因为Java单继承的原因,通常建议是实现Runnable接口.但这种"简单"的线程会带来 ...

  8. STM32串口控制步进电机(原创)

    用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可 ...

  9. javaScript-什么是变量?

    什么是变量? 从字面上看,变量是可变的量:从编程角度讲,变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,为了区分盒子,可以用BOX1,BOX2等名称代表不同盒子,BOX1就是盒子的名 ...

  10. 多线程编程-- part 5.3 LockSupport

    一.LockSupport的介绍 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语.  LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程 ...