迭代器和生成器

1.首先我们先了解什么事迭代

迭代:从一个数据集合中按照一定的顺序,不断地取出数据地过程

迭代和遍历地区别

迭代强调地是依次取出,不能确定取出多少,也不能保证把数据全部取出来

遍历:我们就见的多了,他也是依次的取出,但是我们是知道里面的个数的

迭代器:他就是对迭代过程的封装,通常为对象

js的迭代器:js规定如果一个对象有next方法,并且返回一个对象,就认为这个对象为迭代器,在es6中,如果一个对象具有知名符号属性Symbol,iterator,这表示对象可迭代

for....of循环只能循环可以迭代的对象

优点: 完全不需要在集合中追踪索引,让你更专注于集合内容的操作

原理:for-lof 循环会在可迭代类型每次迭代执行后调用 next() 并将结果对象存储在变量中。循环会持续进行直到结果对象的 done 属性为 true。

let values = [1,2,3];

for (const num of values) {

console.log(num);

} // 依次输出 1 2 3

过程: for-of循环会调用values数组的Symbol.iterator方法来获取迭代器iterator(Symbol.iterator 方法由幕后的 JavaScript 引擎调用)。之后再调用iterator.next()并将结果对象中的value属性值依次赋给num变量。当检测到结果对象中的done为true时,循环退出。
我们首先用es5语法来创建一个迭代器

function createIterator(items) {
var i = 0;

return { // 返回一个迭代器对象
next: function() { // 迭代器对象一定有个next()方法
var done = (i >= items.length);
var value = !done ? items[i++] : undefined;

return { // next()方法返回结果对象
value: value,
done: done
};
}
};
}

var iterator = createIterator([1, 2, 3]);

console.log(iterator.next()); // "{ value: 1, done: false}"
console.log(iterator.next()); // "{ value: 2, done: false}"
console.log(iterator.next()); // "{ value: 3, done: false}"
console.log(iterator.next()); // "{ value: undefiend, done: true}"
// 之后所有的调用都会返回相同内容
console.log(iterator.next()); // "{ value: undefiend, done: true}"

这样写感觉代码还是很复杂,因此es6中引入了生成器对象,可以让创建迭代器的过程变得跟简单

2.生成器(generator)在生成器函数内部调用别的生成器函数一定要加*

什么是生成器:生成器就通过构造函数Generator创建出来的对象

生成器即是一个迭代器,同时又是一个可迭代的对象

特点:function*,同时还使用yield关键字

原理:当执行流遇到yield语句时,该生成器就停止运转了,不会执行其他任何部分的代码,指导迭代器再次调用next()方法,yield再执行。

这里async和*不能同时加

注意;1.生成器有返回值,出现最后一次的done为true的value

  2.调用生成的next()的方法是,可以传递参数,传递的参数会交给yield表达式的返回值

3.第一次调用函数时,传递的参数是没有任何意义的

// 生成器 同样一个例子,使用生成器来创建迭代器就显得很简洁了
function* createInterator(items) {
for (let i = 0; i < items.length; i++) {
yield items[i];
}
}
// 调用生成器类似于调用函数,但是前者返回一个迭代器
var interator = createInterator([1, 2, 3]);

console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next()); // "{ value: 2, done: false }"
console.log(iterator.next()); // "{ value: 3, done: false }"
console.log(iterator.next()); // "{ value: undefined, done: true }"
console.log(iterator.next()); // "{ value: undefined, done: true }"

 

posted @ 2020-03-27 16:14  笑等茶凉zl  阅读(116)  评论(0编辑  收藏  举报