模拟Iterator机制(数组、对象) 、Generator

本文介绍了如何模拟JavaScript中的Iterator机制,包括对数组和对象的遍历,并探讨了Generator函数及yield表达式的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟Iterator机制(数组)

 //模拟Iterator机制(遍历器) 数组
        function makeIteractor(array) {
            var nextIndex = 0;//遍历过程中的数组的索引
            return {
                next: function () {
                    if (nextIndex < array.length) {
                        return { value: array[nextIndex++], done: false }
                    }
                    return { value: undefined, done: true }
                }
            }
        }
        let arr = [10,10,30,50];
        let iterator = makeIteractor(arr);
        //返回的是一个对象
        let obj = iterator.next();
        //对象的属性值又是一个函数,调用这个函数会有返回值
        console.log(obj);
        let {value,done} = iterator.next();
        console.log(value,done);

模拟Iterator机制(对象)

        //以对象为例,给对象部署默认的iterator接口
        let obj = {
            "name": "张三",
            "age": 18,
            "addr": "北京"
        }
        // 部署默认接口 Symbol.iterator,用来访问不同数据接口,真正实现iterator功效,只要拥有Symbol.iterator属性,就可以使用for...of...
        // obj有一个属性Symbol,这个属性的值是一个对象
        obj[Symbol.iterator] = function () {
            let keys = Object.keys(this);
            // this指向当前的对象obj,keys方法用于取出当前对象所有的键(key)[name,age,addr]
            let index = 0;//记录索引下标
            // 返回一个对象,该对象的属性值是一个函数
            return {
                next: ()=> {
                    if (index < keys.length) {
                        let key = keys[index++];
                        //取出数组中的键
                        return { value: this[key], done: false };
                    } else {
                        return { value: undefined, done: true };
                    }

                }
            }
        }
        let iterator = obj[Symbol.iterator]();
        console.log(iterator);
        let obj1 = iterator.next();
        console.log(obj1);

        for(let item of obj){
            console.log(item);
        }
        //张三 18  北京

Generator

  • Generator是一个状态机器,内部封存了多个状态,直接调用Generator函数并不会执行,而是返回结果 Iterator
  • Generator函数经常来搭配yield表达式使用,完成程序的分步执行
 function* show(){//*可以放在function和show()之间,有没有空格都可以
        yield console.log(1111);
        yield console.log(2222);
        yield console.log(3333);
       }
       let i = show();//iterator迭代器
       i.next();//1111
       i.next();//2222
       i.next();//3333
  • yield表达式是没有返回值的,若需要获取yield表达式后面的结果,则需要通过next方法来传递数据才可以
function * show() {
            let num = yield Math.pow(2, 2);
            console.log(num);//undefined
        }
        //调用show返回一个iterator
    let i = show();
    i.next();//执行第一句
    i.next();//执行第二句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值