迭代器(Iterator) 和 生成器 (Generator) (八)

迭代器与生成器这一章节还没有看的恨透,只把这一章节的例子全看完了,也看懂了。但是自己写不出这样优秀的代码。这是我缺少的技能。

//迭代器(Iterator)和生成器(Generator)
        
         // 迭代器是一种特殊对象
        //所有的迭代器都有一个next()方法,每次调用都返回一个结果对象。结果对象有两个属性:一个是值,表示下一个将要返回的值;另一个是完成,它是一个布尔类型的值,当没有更多可以返回数据时返回true
        // es5仿制一个迭代器

        / * function createInterator(items ){
            var i = 0;

            return {
                next:function(){
                    var done =(i> = items.length);
                    var value =!完成?items [i ++]:undefined;

                    return {
                        done:done,
                        value:value
                    };
                }
            }
        }
        VAR迭代= createInterator([1,2,3]);
        console.log(iterator.next())//“{value:1,done:false}”* /


        //生成器是一种返回迭代器的函数
        //通过功能关键字后的星号(*)来表示,函数中会用到新的关键字yield。//
        
        生成器
        //也可以给函数传递一个数组项目循环生成yield items [i]

        / * function * createInterator(){
            yield 1;
            产量2;
            产量3;
        }
        //生成器的调用方式与普通函数相同,只不过返回的是一个
        迭代 let iterator = createInterator();
        的console.log(iterator.next()); // 1 * /


        // yield关键字只可在生成器内部使用,在其他地方会导致程序抛出语法错误
        //它与返回关键字一样,二者都不能穿透函数的边界。//
        不能用箭头函数创建生成器

        


        //可迭代对象和for-of循环
        //可迭代对象具有Symbol.iterator属性,是一种与迭代器密切相关的对象
        //由于生成器默认会为Symbol.iterator属性赋值,因此所有通过生成器创建的迭代器都是可迭代对象

        / * let values = [1,2,3];
        for(let item of values){
            console.log(item)
        } * /

        //访问默认的
        迭代器对象//可以用Symbol.iterator属性,来检测是否为可迭代对象
        // console.log(values [Symbol.iterator]())

        


        建迭代器
        数组,Map集合和Set集合都内置了三种迭代器
        1. entries()返回一个迭代器,其值为多个键值对
        2. values()   返回一个迭代器,其值为集合的值
        3. keys()返回一个迭代器,其值为集合中的所有键名

        
         let values = [1,2,3]
        console.log(values )
        
        entries()迭代器其他迭代器类似
        let colors = ['red','yellow','green'];
        let tracking = new Set([1234,45678,9012]);
        let data = new Map();

        data.set(“title”,“了解ECMAScript 6”);
        data.set(“format”,“ebook”);

        for(输入colors.entries()){
            console.log(entry);
        }

        for(let entry of entry.entries()){
            console.log(entry);
        }

        for(输入data.entries()){
            console.log(data);
        } 
        
        在for-of循环中,如果没有显示的指定则使用默认的
        迭代//数组和Set集合的默认迭代器是values()方法
        Map集合的迭代器默认的是entries( )方法


        字符串迭代器这个和深入理解es6中的结果不一样(我在浏览器端尝试的)
         let str =“a机b”;
        for(let i = 0; i <str.length; i ++){
            console.log(str [i])
        } 


        高级迭代器的功能
         function * createInterator(){
            let first = yield 1;
            让second = yield first +2; // 4 + 2
            产生第二+ 3; // 5 + 3
        }
        let iterator = createInterator();
        的console.log(iterator.next()); // 1 ...
        console.log(iterator.next(4)); // 6 ...
        console.log(iterator.next(5)); // 8 ...
        console.log(iterator.next()); 
        由于第一次调用next()方法时,无论传入什么值都是输出1
        如果给迭代器的next( )传入参数,则这个参数会替代生成上一条得到语句的返回值

         function run(taskDef){

            创建一个无限使用限制的
            迭代 let task = taskDef();

            //开始执行任务
            let result = task.next();

            循环调用next()函数
            function step(){

                如果任务未完成,则继续执行
                if(!result.done){
                    result = task.next(result.value);

                     next();
                }
            }

            开始迭代执行
            step();
        }

        run(function *(){
            let value = yield 1;
            console.log(value);

            value=value+3;
            console.log(value);
        })* /

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值