Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

❤️❤️Question023 -JavaScript、js中的迭代器和生成器 #23

Open
wangbinze opened this issue Mar 8, 2021 · 1 comment
Open

Comments

@wangbinze
Copy link
Owner

题目:js中的迭代器和生成器

@wangbinze
Copy link
Owner Author

ECMAScript 6 规范新增了两个高级特性“迭代器和生成器。能够清晰、高效、方便地实现迭代。

迭代器

理解迭代

循环是迭代机制的基础。
迭代会在一个有序集合上进行。("有序"可以理解为集合中所有项都可以按照既定的顺序被遍历到,特别是开始和结束项有明确的定义。)数组是JavaScript中有序集合的最典型例子。

迭代器模式

即可以把有些结构成为“可迭代对象”(iterable),因为它们实现了正式的Itetable接口,而且可以通过迭代器Iterator消费。
可以把可迭代对象理解成数组或集合这样的集合类型的对象。它们包含的元素都是有限的,而且都具有无歧义的遍历顺序。
可迭代对象不一定是集合对象,也可以是仅仅具有类似数组行为的其他数据结构。

迭代器协议

  • 迭代器是一种一次性使用的对象,用于迭代与其关联的可迭代对象。
  • 迭代器API使用next()方法在可迭代对象中遍历数据。每次成功调用next(),都返回一个IteratorResult对象,其中包含迭代器返回的下一个值。若不调用next(),则无法知道迭代器的当前位置。
  • next()方法返回的迭代器对象 IteratorResult 包含两个属性:done 和 value。done 是一个布尔值,表示是否还可以再次调用 next()取得下一个值;value 包含可迭代对象的下一个值(done 为false),或者 undefined(done 为 true)。done: true 状态称为“耗尽”。
// 可迭代对象
let arr = ['foo', 'bar']; 
// 迭代器工厂函数
console.log(arr[Symbol.iterator]); // f values() { [native code] } 
// 迭代器
let iter = arr[Symbol.iterator](); 
console.log(iter); // ArrayIterator {} 
// 执行迭代
console.log(iter.next()); // { done: false, value: 'foo' } 
console.log(iter.next()); // { done: false, value: 'bar' } 
console.log(iter.next()); // { done: true, value: undefined }

提前终止迭代

可选的 return()方法用于指定在迭代器提前关闭时执行的逻辑。执行迭代的结构在想让迭代器知道它不想遍历到可迭代对象耗尽时,就可以“关闭”迭代器。可能的情况包括:

  • for-of 循环通过 break、continue、return 或 throw 提前退出;
  • 解构操作并未消费所有值。

生成器

拥有在一个函数快内暂停和恢复代码块执行的能力。比如,使用生成器可以自定义迭代器和实现协程。

生成器基础

生成器的形式是一个函数,函数名称前面加一个星号(*)表示它是一个生成器。只要是可以定义函数的地方,就可以定义生成器。
注意:箭头函数不能用来定义生成器函数。

调用生成器函数会产生一个生成器对象。生成器对象一开始处于暂停执行(suspended)的状态。与迭代器相似,生成器对象也实现了 Iterator 接口,因此具有 next()方法。调用这个方法会让生成器开始或恢复执行。

生成器的独特之处在于支持 yield 关键字,这个关键字能够暂停执行生成器函数。使用 yield 关键字还可以通过 next()方法接收输入和产生输出。在加上星号之后,yield 关键字可以将跟在它后面的可迭代对象序列化为一连串值。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant