iterator迭代器

纸飞机 发表于 2021/10/19 01:08:04 2021/10/19
【摘要】 1、什么是迭代器(iterator) 迭代器是一种特殊对象,是为各数据结构的迭代过程设计的专有接口。迭代器对象都有一个next。方法,每一次调用next方法 , 都会返回数据结构的当前成员的信息,即返回一个对象: {done: Boolean, value: any} value:当前成员的值。 done:布尔值,表示...

1、什么是迭代器(iterator)

迭代器是一种特殊对象,是为各数据结构的迭代过程设计的专有接口。迭代器对象都有一个next。方法,每一次调用next方法 , 都会返回数据结构的当前成员的信息,即返回一个对象:

{done: Boolean, value: any}

value:当前成员的值。

done:布尔值,表示遍历是否结束。

这样不断调用next方法,直到遍历结束。


  
  1. //用ES5创建一个迭代器:
  2. function createlterator(arr){
  3. var i = 0;
  4. return {
  5. next: function(){
  6. var done = (i >= arr.length);
  7. var value = !done? arr[i++]:undefined;
  8. return {
  9. done: done,
  10. value: value
  11. }
  12. }
  13. }
  14. }
  15. var iterator = createlterator([1,2,3]);
  16. console.log(iterator.next());
  17. //{done: false, value: 1}
  18. console.log(iterator.next());
  19. // {done: false, value: 2}
  20. console.log(iterator.next());
  21. //{done: false, value: 3}
  22. console.log(iterator.next());
  23. //{done: true, value: undefined}

上述ES5的例子较复杂,ES6引入了生成器 Generator,它是一种以更简单的方式创建迭代器的函数。该函数通过function后的星号"*"表示,使用内部专用关键字yield作为暂停标识,yield后表达式的值即为迭代器next。返回值中的value值。


  
  1. //用ES6生成器创建一个迭代器:
  2. function *createlterator(arr){
  3. for (let i=O;i<arr.length;i++){
  4. yield arr[i];
  5. }
  6. }
  7. let iterator = createlterator([1,2,3]);
  8. console.log(iterator.next());
  9. // {done: false, value: 1}
  10. console.log(iterator.next());
  11. // {done: false, value: 2}
  12. console.log(iterator.next());
  13. //{done: false, value: 3}
  14. console.log(iterator.next());
  15. //{done: true, value: undefined}

当我们调用Generator函数时,并不会执行该函数,而是返回一个迭代器。

当该迭代器调用next方法时,就会开始执行函数,在执行完第一句yield语句后自动暂停,并将yield
后的表达式的值作为其返回值的value。

当再次调用next方法时才会从上次停止的地方(yield [表达式]处的后面)开始继续执行,直到执行
完下一句yield语句。 

2、什么是可迭代对象(iterator)

如果对象含有Symbol.iterator属性,就认为是可迭代的。Symbol.iterator本身是一 个函数,即当前数据结构的迭代器生成函数(生成器或es5函数),可以返回一个作用于附属对象的迭代器 。 常见 的Array, Map, Set, String, arguments 等都是原生可迭代对象 , 具有内置的Symbol.iterator属性(生成器),ES6的for-of需要用到可迭代对象的该属性。

3、for-of循环机制

可迭代对象可以使用一些ES6方法,例如 for..of语句和扩展运算符(…)。for-of在可迭代对象上创建一个迭代循环,并为每个不同属性的值执行语句。其原理是首先会调用[Symbol.iterator]。方法,返回一个迭代器对象,内含next。方法,然后重复调用 next。方法,循环一次就调用一次并得到返回值中的value。

4、访问迭代器


  
  1. //通过Symbol.iterator。来访问可迭代对象的迭代器
  2. let items = [1,2,3];
  3. let iterator = items[Symbol.iterator]();
  4. console.log(iterator.next());
  5. // {done: false, value: 1}
  6. console.log(iterator.next());
  7. // {done: false, value: 2}
  8. console.log(iterator.next());
  9. // {done: false, value: 3}
  10. console.log(iterator.next());
  11. //{done: true, value: undefined}

5、普通对象变可迭代对象

一般开发中定义的对象都是不可迭代对象 ,不能使用 for - of ( 会报错 : xx is not iterable)。但如果给对象部署 Symbol.iterator属性,添加一个生成器 (es5传统生成函数也可以,但用生成器是 主流),可以使其变为可迭代对象。


  
  1. let obj = {
  2. "0":"aa",
  3. "1":"bb",
  4. "2":"cc"
  5. }
  6. obj[ Symbol.iterator ] = function *(){
  7. for(let key in this){
  8. let val = this[key];
  9. yield val;
  10. }
  11. }
  12. for(let i of obj){
  13. console.log(i)
  14. }
  15. //aa
  16. //bb
  17. //cc

6、总结

迭代器:一种可以调用内部next方法进行 手动迭代的对象。

生成器:一种用来创建迭代器的函数。

可迭代对象:一种具有Symbol.iterator属性或称iterator接口的能被for of语句自动迭代的对象。Symbol.iterator属性对应着一个迭代器生成函数。

另外:通过生成器(*)返回的迭代器同时也是可迭代对象 。 因为生成器会默认为其添加 Symbol.iterator属性,会返回该迭代器本身。这样可以让一个迭代器也能被可迭代对象的语法(for of或展开符…)所应用。如果是用es5函数创建的迭代器 , 返回时一般会自主添加 [Symbol.iterator]: function(){ return this },使其也成为可迭代对象。 

文章来源: root181.blog.csdn.net,作者:前端纸飞机,版权归原作者所有,如需转载,请联系作者。

原文链接:root181.blog.csdn.net/article/details/120107961

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。