1、迭代器模式
- 1.1、迭代器:
-
- 迭代器是通过使用next()方法实现迭代器协议的的任何一个对象,该方法返回具有两个属性的对象:value,这是序列中的next值;和done ,如果已经迭代到序列中的最后一值,则它为true。如果 value和done一起存在,则它是迭代器的返回值。
-
- 一旦创建,迭代器对象可以通过重复调用next()显示地迭代。
- 1.2、可迭代协议:
-
- 可迭代协议允许JS对象定义或定制它们的迭代行为,例如,在一个 for…of 结构中,哪些值可以被遍历到。一些内置类型同时是内置可迭代对象,并且有默认的迭代行为,比如 Array 或者 Map,而其他内置类型则不是(比如 Object))。
-
- 要成为可迭代对象,一个对象必须实现 @@iterator 方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为@@iterator的属性,可通过常量[Symbol.iterator]访问该属性
- 1.3、迭代器协议:
-
- 迭代器协议定义了产生一系列值(无论是有限个还是无限个)的标准方式。当值为有限个时,所有的值都被迭代完毕后,则会返回一个默认返回值。
-
- 只有实现了一个拥有以下语义(semantic)的 next() 方法,一个对象才能成为迭代器
2、生成器
- 1、生成器基础:
-
- 虽然自定义地迭代器是一个有用的工具,但由于需要显式地维护内部状态,因此需要谨慎地创建
-
- 生成器函数提供了一个强大的选择:它允许你定义一个包含有迭代算法的函数,同时它可以自动维护自己的状态。
-
- 生成器函数使用function*语法编写。 最初调用时,生成器函数不执行任何代码,而是返回一种称为 Generator的迭代器。 通过调用生成器的下一个方法消耗值时,Generator函数将执行,直到遇到 yield 关键字。
-
- 生成器函数在执行时能暂停,后面又能从暂停处继续执行。
-
- 调用一个生成器函数并不会马上执行它里面的语句,而是返回一个这个生成器的迭代器( iterator )对象。当这个迭代器的next()方法被首次(后续)调用时,其内的语句会执行到第一个(后续)出现yield的位置为止,yield 后紧跟迭代器要返回的值。
- 2、yield
-
[rv] = yield [expression];
rv:返回传递给生成器的next()方法的可选值,以恢复其执行
expression:定义通过迭代器协议从生成器函数返回的值。如果省略,则返回undefined
-
- 描述:yield关键字使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
-
- 一旦遇到yield表达式,生成器的代码将被暂停运行,直到生成器的next()方法被调用。每次调用生成器的next()方法时,生成器都会恢复执行,直到达到以下某个值:yield、throw、return、生成器函数的结尾
function *gen(){
yield 10;
x=yield 'foo';
yield x;
}
var gen_obj=gen();
console.log(gen_obj.next());
console.log(gen_obj.next());
console.log(gen_obj.next(100));
console.log(gen_obj.next());
- 3、yield*:用于委托给另一个生成器或可迭代对象
- 4、提前终止迭代器:
-
-
- throw():该方法会在暂停的时候将一个提供的错误注入到生成器对象中。如果错误未被处理,生成器就会关闭