前言
ES6中,引入了迭代器和生成器的概念。
久违了的名字,上次见到还是在《Python核心编程》里呐!
所以说JS越来越正统语言了呀~~~
迭代器(Iterators)碎碎念
迭代器就是可以迭代输出值的一个东西。
迭代器每一次迭代会返回一个对象,这个对象长这样子:
1
| {value: xx, done: true/false}
|
value表示返回的值, done表示还有没有可以迭代的东西。
如果还可以迭代,那么就是true,否则是false。
然后迭代器里面还有一个关键觉得就是next()方法,它是用来进行下一次迭代用的。
具备以上要素的东西,就是迭代器。
手工创造迭代器
手写一个迭代器来看!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 'use strict'
function chef(foods) { let i = 0; return { next() { let done = (i >= foods.length); let value = !done? foods[i++] : undefined;
return { value: value, done:done } } } }
let wanzi = chef(["🍅", "🍹"]); console.log(wanzi.next()); console.log(wanzi.next()); console.log(wanzi.next());
|
顺序输出的分别是
1 2 3
| {value: 🍅, done: false} {value: 🍹, done: false} {value: undefined, done:true}
|
这上面,wanzi就是一个迭代器。
生成器(generators)碎碎念
楼上那段代码里面,生成迭代器的那个构造函数,就叫做生成器。
手动写一个生成器,是不是也够麻烦了。
我们可以使用另一种方法简单地做出一个生成器:
1 2 3 4 5 6 7 8 9 10 11 12
| 'use strict'
function* chef() { yield "🍅"; yield "🍹"; }
let wanzi = chef();
console.log(wanzi.next()); console.log(wanzi.next()); console.log(wanzi.next());
|
楼上这段代码,输出的东西和上面我们手写输出的东西一毛一样!!
让chef生成器进化一下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 'use strict'
let chef = function* (foods) { for(var i = 0; i < foods.length; i++) { yield foods[i]; } }
let wanzi = chef(["🍅", "🍹"]);
console.log(wanzi.next()); console.log(wanzi.next()); console.log(wanzi.next());
|
楼上这段代码,和楼上的楼上,楼上的楼上的楼上实现的效果一毛一样。
因此我们看到,这个生成器其实还是函数,仍然可以使用函数定义表达式,可以传参。
结语
上一次接触到生成器和迭代器,还是在学python的时候(15年的暑假)。
时间过的真快啊。
JS一直在进步,自己每一天也要努力进步啊~~