JS中的迭代器和生成器

一.迭代器

1.1迭代器基本概念

     迭代器(Iterator)描述了一个方案,即可以把实现了Iterator接口的某些结构称为可迭代对象,而且可以通过迭代器消费,可以完成遍历操作。

1.2迭代器协议

      在JS中,很对内置类型都实现了Iterable接口,包括:字符串(String),数组(Array),映射(Map),集合(Set),arguments对象,NodeList等DOM集合类型。

      可迭代对象的迭代器方法名为[Symbol.iterator]

     迭代器是一种一次性使用的对象,用于迭代与其关联的可迭代对象,迭代器的API使用next方法在可迭代对象中遍历数据,next方法会返回一个IteratorResult对象,其中包含两个属性,done和value。done是一个布尔值,表示是否还可以再次调用next来取得下一个值;value表示可迭代对象的下一个值(done为false)或者undefined(done为true)。当done为true时2表示可迭代状态耗尽。

1.3应用

     在实际写代码过程中,不需要显示调用工厂函数来生成迭代器。实现可迭代协议的所有类型都会自动兼容接受可迭代对象的任何语言特性。接收可迭代对象的原生语言特性包括:

    for-of循环,数组解构,扩展操作符,Array.from(),创建集合,创建映射,Promise.all()接收由期约组成的可迭代对象,Promise.race()接收由期约组成的可迭代对象,yield*操作符,在生成器中使用。

      如果想要自定义遍历数据,就可以使用迭代器

 const obj={
            name:'xu',
            friend:[
                'wang',
                'liu',
                'zhang',
                'zhu'
            ],
            [Symbol.iterator](){
                let index=0;
                return{
                    next:()=>{
                        if(index<this.friend.length){
                            const res={
                                value:this.friend[index],
                                done:false
                            };
                            index++;
                            return res
                        }
                        else{
                            return{
                                value:undefined,
                                done:true
                            }
                        }
                    }
                }
            }
        }
        for(let i of obj){
            console.log(i);
        }

     二.生成器

         2.1生成器概念

              生成器是ES6定义的迭代器,是一种异步编程解决的方案。生成器可以理解为一个特殊的函数。在函数名称前面加上*表示它是一个生成器,只要可以定义函数的地方,就可以定义生成器。

        2.2yield表达式的值

             生成器通过yield向调用者返回值,调用者通过next()方法给生成器传值。在调用生成器的next()方法时,运行到第一个yield表达式,yield关键字后面的表达式会被求值,该值成为next()调用的返回值,这时生成器函数在求职yield表达式中暂停,下一次调用next()方法的时候,传入的参数会变成暂停的yield表达式的值。

        2.3总结

              1.通过调用生成器函数来创建迭代器(这个时候生成器函数不会执行)

              2.通过迭代器调用next执行生成器函数里面的代码

              3.执行到yield暂时跳出函数并且把yield后面是值加工成对象返回到调用next的地方。

             

                

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值