js迭代器和生成器的运用,迭代语句有哪些

  js迭代器和生成器的运用,迭代语句有哪些

  这篇文章带给你一些关于javascript的知识,主要是关于迭代器的知识。迭代是指按照一定的顺序从数据集中连续提取数据的过程。下面就来看看吧,希望对你有帮助。

  【相关推荐:javascript视频教程,web前端】

  迭代是指按照一定的顺序从数据集连续取数据的过程。

  那么迭代和遍历有什么区别呢?

  迭代强调的是依次取数的过程,并不保证所有的数据都会被取到。遍历强调所有的数据都应该在JavaScript中依次取出。Iterator是一个可以调用下一个方法进行迭代的对象,它返回一个具有两个属性的对象。

  value:iterable对象的下一个值,done:表示是否已经获取了所有数据。True表示仍有数据,true表示没有留下任何数据。

迭代器简单使用

  通过迭代器工厂函数Symbol.iterator在可迭代对象中生成迭代器。

  const arr=[]console.log(arr)

  const arr=[1,2,3]

  constiter 1=arr[Symbol.iterator]()//通过迭代器工厂函数“symbol . iterator”生成迭代器。

  console.log(iter1)

  console.log(iter1.next())

  console.log(iter1.next())

  console.log(iter1.next())

  console.log(iter1.next())

  console.log(%c%s , color:red; font-size:24px;, ================)

  const mymap=新地图()

  mymap.set(name , clz )

  mymap.set(年龄,21)

  constiter 2=mymap[Symbol.iterator]()//通过迭代器工厂函数“symbol . iterator”生成迭代器。

  console.log(iter2)

  console.log(iter2.next())

  console.log(iter2.next())

  console.log(iter2.next())

  可以发现是在迭代器是取完的最后一个值之后完成的,也就是迭代器的下一个值未定义的时候。

  但是上面的语句不是很准确,在迭代器的下一个值未定义的情况下没有完成。还需要确定是否真的没有值,或者在iterable对象中是否有未定义的值。如果iterable对象中有undefined值,则此时不会完成。

  const arr=[1,2,3,未定义]

  constiter 1=arr[Symbol.iterator]()//通过迭代器工厂函数“symbol . iterator”生成迭代器。

  console.log(iter1)

  console.log(iter1.next())

  console.log(iter1.next())

  console.log(iter1.next())

  console.log(iter1.next())

  console.log(iter1.next())

  

不同迭代器之间互不干扰

  迭代器工厂函数可以多次调用,生成多个迭代器,每个迭代器代表一个可迭代对象的一次性有序遍历。不同迭代器之间互不干扰,只会独立地遍历可迭代对象

  const arr=[1,2,3]

  constiter 1=arr[Symbol.iterator]()//通过迭代器工厂函数“symbol . iterator”生成迭代器。

  const ITER 2=arr[symbol . iterator]()

  Console.log (iterator 1:,iter1.next())

  Console.log (iterator 2:,iter2.next())

  Console.log (iterator 1:,iter1.next())

  Console.log (iterator 2:,iter2.next())

  

迭代器对象可作为可迭代对象

   const arr=[1,2,3]

  const iter=arr[Symbol.iterator]()

  for(ITER的常数I){

  Console.log(i) //依次输出1、2、3

  }

迭代器"与时俱进"

  如果iterable对象在迭代过程中被修改,那么迭代器得到的结果也会被修改。

  const arr=[1,2,3]

  console.log(arr)

  const iter=arr[Symbol.iterator]()

  console.log(iter.next())

  arr[1]=999

  console.log(iter.next())

  console.log(iter.next())

  

完成但并不完成

  当我们迭代到done: true时,调用next会报错还是不返回任何东西?

  然而,事实并非如此。迭代器将处于完成但并不完成的状态。done: true表示完成了,但是后续总是可以调用next,虽然结果永远是{value: undefined,done: true}。所以我们说完成但并不完成

  const arr=[1,2,3]

  const iter=arr[Symbol.iterator]()

  console.log(iter.next())

  console.log(iter.next())

  console.log(iter.next())

  console.log(iter.next())

  console.log(iter.next())

  console.log(iter.next())

  

自定义迭代器

  从上面的例子我们可以知道是通过通过迭代器工厂函数 Symbol.iterator来生成迭代器,所以我们需要实现一个迭代器迭代器工厂函数,然后迭代器可以调用next方法,所以我们还需要实现一个next方法。至于迭代器工厂函数,我们实际上直接返回实例this。

  计数器的示例:

  类别计数器{

  构造器(限制){

  this.count=1

  this.limit=limit }

  下一个(){

  if (this.count=this.limit) {

  返回{

  done: false,

  值:this.count

  }

  }否则{

  返回{ done: true,value: undefined }

  }

  }

  [Symbol.iterator]() {

  归还这个

  } }常量计数器=新计数器(3)

  const ITER=counter[symbol . iterator]()

  console.log(iter.next())

  console.log(iter.next())

  console.log(iter.next())

  console.log(iter.next())

  console.log(iter.next())

  乍一看没有问题,但是如果用for-of来遍历,就能发现问题。

  const Counter=new Counter(3)for(let I of Counter){

  Console.log(i)}console.log(另一个迭代:)for (let i of counter) {

  console.log(i)}

  for-of循环的使用也变成了一次性的。这是因为count是这个实例的变量,所以它是两次迭代中使用的同一个变量。但是,在第一次循环之后,这个变量已经超过了极限,所以再次使用for-of循环也无法得到任何结果。

  您可以将count变量放在闭包中,然后通过闭包返回迭代器,这样创建的每个迭代器都会对应一个新的计数器。

  类别计数器{

  构造器(限制){

  this.limit=limit }

  [Symbol.iterator]() {

  让count=1

  const limit=this.limit返回{

  //迭代器工厂函数必须用next方法返回一个对象,因为迭代实际上是通过调用next方法实现的。

  下一个(){

  if(计数=限制){

  返回{

  done: false,

  值:计数

  }

  }否则{

  返回{ done: true,value: undefined }

  }

  }

  }

  }}测试

  const Counter=new Counter(3)for(let I of Counter){

  Console.log(i)}console.log(另一个迭代:)for (let i of counter) {

  console.log(i)}

  

提前终止迭代器

  就像使用for-of循环一样,迭代器会足够智能地调用下一个方法,当迭代器提前终止时,也会调用返回方法。

  [Symbol.iterator]() {

  让count=1

  const limit=this.limit返回{

  //迭代器工厂函数必须用next方法返回一个对象,因为迭代实际上是通过调用next方法实现的。

  下一个(){

  if(计数=限制){

  返回{

  done: false,

  值:计数

  }

  }否则{

  返回{ done: true,value: undefined }

  }

  },

  return()

  Console.log(提前终止迭代器)

  返回{ done: true }

  }

  }}测试

  const Counter=new Counter(5)for(let I of Counter){

  if (i===3) {

  打破;

  }

  console.log(i)}

  如果迭代器没有关闭,就可以继续从上次离开的地方继续迭代。不能关闭数组迭代器。

  const arr=[1,2,3,4,5]const ITER=arr[symbol . iterator]()ITER . return=function(){

  Console.log(提前退出迭代器)

  返回{

  完成:正确

  } } for(ITER的常量I){

  console.log(i)

  if (i===2) {

  破裂

  } } for(ITER的常量I){

  console.log(i)}

  【相关推荐:javascript视频教程,web前端】以上是JavaScript迭代器知识点总结的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: