迭代器与生成器【javascript】

迭代器与生成器

迭代器

console.log(x[Symbol.iterator]); //[Function: values]

数组默认有实现迭代器

构造迭代器

let iterator = x[Symbol.iterator]();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
/**
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: 4, done: false }
{ value: undefined, done: true }
 */

迭代器是从头向后迭代、如果迭代器使用时中间插入了新的元素只要在迭代器或之后则迭代器也会做出变化

类迭代器接口,方法实现

class Foo {
    [Symbol.iterator]() {
        return {
            next() {
                return {
                    done: false,
                    value: 'foo'
                }
            }
        }
    }
}
let f = new Foo();
console.log(f[Symbol.iterator]); //[Function: [Symbol.iterator]]

自定义迭代器

class Counter {
    constructor(limit) {
        this.count = 1;
        this.limit = limit;
    }
    next() {
            if (this.count <= this.limit) {
                return {
                    done: false,
                    value: this.count++
                };
            } else {
                return {
                    done: true,
                    value: undefined
                };
            }
        }
        [Symbol.iterator]() {
            return this;
        }
}
let counter = new Counter(3);
for (let i of counter) {
    console.log(i); //1 2 3
}

可以利用闭包 返回多个迭代器

[Symbol.iterator](){
    let count=1,limit=this.limit;
    return {
    next(){
    
    }
    }
}

提前终止迭代器 hook

当在使用for of 时可能会提前结束 使用 break
提前结束时 会自动调用 迭代器的return方法

class T {
    [Symbol.iterator]() {
        return {
            next() {
                return {
                    done: false
                };
            },
            return () {
                console.log("提前终止迭代器");
                return {
                    done: true
                };
            }
        }
    }
}
let t = new T();
for (let i of t) {
    break; //提前终止迭代器
}

生成器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高万禄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值