当前位置:   article > 正文

认识迭代器_迭代器是什么意思

迭代器是什么意思

一、什么是迭代器?

迭代器,是确使用户可在容器对象上遍访的对象,使用该接口无需关心对象的内部实现细节。从迭代器的定义我们可以看出,迭代器是帮助我们对某个数据结构进行遍历的对象。

在Javascript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol)

迭代器协议定义了产生一系列值的标准方式,在js中这个标准就是一个特定的next方法;

next方法有如下的要求:

一个无参数函数,返回一个应当拥有以下两个属性的对象:

done (boolean)

如果迭代器可以产生序列中的下一个值,则为false。(这个等价于没有指定done这个属性。)

如果迭代器已将序列迭代完毕,则为true。这种情况下,value是可选的,如果它依旧存在,即为迭代结束之后的默认返回值。

value:

迭代器返回的任何javascript值,done为true时可省略。

例1.创建一个迭代器对象来访问数组

  1. //数组
  2. const names =["abd","cba","nba"]
  3. //创建一个迭代器对象来访问数组
  4. let index =0
  5. const nameiterator ={
  6. next:function(){
  7. if(index<names.length){
  8. return { done : false, value : names[index++]}
  9. }else {
  10. return { done: true, value :undefined}
  11. }
  12. }
  13. }
  14. console.log(nameiterator.next())
  15. console.log(nameiterator.next())
  16. console.log(nameiterator.next())
  17. console.log(nameiterator.next())
  18. //{ done: false, value: 'abd' }
  19. //{ done: false, value: 'cba' }
  20. //{ done: false, value: 'nba' }
  21. //{ done: true, value: undefined }

例2.生成迭代器函数

  1. //生成迭代器函数
  2. function createArrayIterator(arr){
  3. let index =0;
  4. return {
  5. next:function(){
  6. if(index<arr.length){
  7. return { done:false ,value:arr[index++]}
  8. }else{
  9. return { done:true ,value:undefined}
  10. }
  11. }
  12. }
  13. }
  14. const nums =[10,50,60,70]
  15. const numsIterator =createArrayIterator(nums)
  16. console.log(numsIterator.next())
  17. console.log(numsIterator.next())
  18. console.log(numsIterator.next())
  19. console.log(numsIterator.next())
  20. console.log(numsIterator.next())
  21. //{ done: false, value: 10 }
  22. //{ done: false, value: 50 }
  23. //{ done: false, value: 60 }
  24. //{ done: false, value: 70 }
  25. //{ done: true, value: undefined }
  1. //创建一个无限的迭代器
  2. function createArrayIterator(arr){
  3. let index =0;
  4. return {
  5. next:function(){
  6. return {done:false,value:arr[index++]}
  7. }
  8. }
  9. }

例3.创建一个迭代器对象来访问数组

  1. //创建一个迭代器对象来访问数组
  2. const iterableObj={
  3. names:["鼠","牛","虎","兔"],
  4. [Symbol.iterator]:function(){
  5. let index =0
  6. return { //这里注意用箭头函数,绑定this
  7. next:()=>{
  8. if(index<this.names.length){
  9. return {done:false,value:this.names[index++]}
  10. }else{
  11. return {done:true,value:undefined}
  12. }
  13. }
  14. }
  15. }
  16. }
  17. const iterator1 =iterableObj[Symbol.iterator]()
  18. console.log(iterator1.next())
  19. console.log(iterator1.next())
  20. console.log(iterator1.next())
  21. console.log(iterator1.next())
  22. console.log(iterator1.next())
  23. //{ done: false, value: '鼠' }
  24. //{ done: false, value: '牛' }
  25. //{ done: false, value: '虎' }
  26. //{ done: false, value: '兔' }
  27. //{ done: true, value: undefined }



二.可迭代对象

可迭代对象与迭代器是不同的概念;当一个对象实现了iterable protocol协议时,它就是一个可迭代对象。这个对象的要求是必须实现iterator方法,在代码中我们使用Symbol.iterator访问该属性。

三.可迭代对象的应用

1·JavaScript中的语法     for...of、 展开语法(spread syntax)、 yied*、 解构赋值(destructuing_assignment)

  1. //obj对象不是一个可迭代对象,所以不可以使用of,of需要一个可迭代对象
  2. const obj ={
  3. names:"石榴",
  4. age:18
  5. }
  6. for (const item of obj){
  7. console.log(item)
  8. }
  9. for (const item of iterableObj){
  10. console.log(item)
  11. }

第一段代码会报错,因为obj对象不是一个可迭代对象。for...of需要一个可迭代对象。

第二段代码可以正常执行,iterableObj是一个可迭代对象。

2·创建一些对象时:new Map([Iterable])、new WeakMap([Iterable])、new Set([Iterable])、new  WeakSet([Iterable])

3·一些方法的调用:Promise.all([Iterable])、 Promise.race([Iterable])、Array.from([Iterable])

4.原生(内置)可迭代对象 array/map/set/promise/arguments/string/nodelist               里面都有symbol.iterator

5. of ,展开语法[...names],是可迭代对象;{...obj}不是可迭代对象,只是ES9的一个新特性;解构语法也不是可迭代对象,只是只是ES9的一个新特性

  1. const newObj={...obj}
  2. console.log(newObj)
  3. //{ names: '石榴', age: 18 }
  4. const [name1,name2]=names
  5. console.log(name1) //abd
  6. console.log(name2) //cba



四.自定义类的可迭代对象

  1. class Classroom{
  2. constructor(address,name,students){
  3. this.address=address,
  4. this.name=name,
  5. this.students=students
  6. }
  7. entry(newstudents){
  8. this.students.push(newstudents)
  9. }
  10. [Symbol.iterator](){
  11. let index =0
  12. return {
  13. next:()=>{
  14. if(index<this.students.length){
  15. return {done:false,value:this.students[index++] }
  16. }else{
  17. return {done:true,value:undefined}
  18. }
  19. },
  20. return:()=>{
  21. console.log("迭代器提前终止了~")
  22. return {done:true,value:undefined}
  23. }
  24. }
  25. }
  26. }
  27. const classroom =new Classroom("工一","503",["金","霞","阿姨"])
  28. classroom.entry("林狗")
  29. for(const item of classroom){
  30. console.log(item)
  31. if(item==="霞") break
  32. }
  33. //金
  34. //霞
  35. //迭代器提前终止了~
  36. const foo =classroom[Symbol.iterator]()
  37. console.log(foo.next())
  38. console.log(foo.next())
  39. console.log(foo.next())
  40. console.log(foo.next())
  41. console.log(foo.next())
  42. console.log(foo.next())
  43. //{ done: false, value: '金' }
  44. //{ done: false, value: '霞' }
  45. //{ done: false, value: '阿姨' }
  46. //{ done: false, value: '林狗' }
  47. //{ done: true, value: undefined }
  48. //{ done: true, value: undefined }


 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号