ES6迭代器(Iterator)和生成器(Generator)

2023-07-29,,

平时我们迭代数据用得最多的应该就是for循环了

来看个简单的例子

     var colors = ["red", "green", "blue"];
for (var i = 0, len = colors.length; i < len; i++) {
console.log(colors[i]);
}

如上循环是很简单,但是一旦使用多个循环嵌套时,就需要为每一个循环定义变量,来记录每一次执行迭代时所处集合中的位置,一不小心就会误用了其他for循环的变量,导致程序错误。然而迭代器可以简化操作,降低程序异常。接下来我们就一起看看什么事迭代器

一、什么是迭代器

迭代器:是一种特殊对象,他具有一些专门为迭代过程设计的专有接口,所有的迭代器对象都有一个next()方法,每次调用都返回一个结果对象。结果对象有两个属性:一个是value,表示下一个将要返回的值;另一个是done,他是一个布尔类型的值,在当没有可返回的数据时返回true,预示着迭代结束

现在使用ECMAScript 5 语法构建一个迭代器:

 function createIterator() {
var i = 0;
return {
next: function () {
var done = (i >= items.length);
var value = !done ? items[i++] : undefined;
return {
done: done,
value: value
}
}
}
} var iterator = 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}"

在这个案例中createIterator()方法会返回一个对象,该对象拥有一个next()方法,每次调用next()方法,都会判断 i 是否大于等于 当前实参的长度;大于或等于时done 即为true,反之亦然。然后将done取反;当done为truevalue 赋值为undefined;否则将i+1,再取item 对应下标的值赋值于value。其实ES6迭代器实现原理和案例也就类似。

二、什么是生成器

生成器是一种返回迭代器的函数, 通过function 关键字后的星号(*)来表示,函数中会使用到新的关键字 yield。星号可以紧挨着function,也可以在中间添加一个空格。

	// 在createIterator()前的 * 表示他是一个生成器
function *createIterator() {
yield 1;
yield 2;
yield 3;
}
//生成器的调用和 普通函数相同,只是他返回的是一个迭代器
var iterator = createInterator();
console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3

需要注意的是,每当执行完一条yield 乬后函数就会自动停止执行。 如上面的案例,当函数初始化执行完yield 1 之后,函数便不会向下执行,直到再次调用迭代器的next()方法才会继续向下执行yield 2语句

今天先做个简单的了解,明天继续…

ES6迭代器(Iterator)和生成器(Generator)的相关教程结束。

《ES6迭代器(Iterator)和生成器(Generator).doc》

下载本文的Word格式文档,以方便收藏与打印。