生成器和迭代器,和可迭代对象

什么是生成器

它允许你定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。
生成器函数使用 function*语法编写。 最初调用时,生成器函数不执行任何代码,而是返回一种称为Generator的迭代器。 通过调用生成器的next() 方法消耗值时,Generator函数将执行,直到遇到 yield关键字。

可以根据需要多次调用该函数,并且每次都返回一个新的Generator迭代器,但每个Generator只能迭代一次。

Generator迭代器对象可以通过重复调用next()显式地迭代。 在产生终止值之后,对next()的额外调用会返回{done:true}。

我们看一个具体的例子:

function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
    for (let i = start; i < end; i += step) {
        yield i;
    }
}
var a = makeRangeIterator(1,10,2)
a.next() // {value: 1, done: false}
a.next() // {value: 3, done: false}
a.next() // {value: 5, done: false}
a.next() // {value: 7, done: false}
a.next() // {value: 9, done: false}
a.next() // {value: undefined, done: true}

value:这次迭代的值;done:一般为false,如果已经迭代到序列中的最后一个值,则它为 true

可迭代对象

String、Array、TypedArray、Map 和 Set 都是内置可迭代对象,因为它们的原型对象都拥有一个 Symbol.iterator 方法。

Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for…of 循环使用,也可以用next进行迭代

所以Object如果要变成可迭代对象,就需要给prototype加上一个 Symbol.iterator 方法。

const obj = {
  0: 1,
  1: 2,
  2: 3,
  length: 3,
};

Object.prototype[Symbol.iterator] = iterator;

function iterator() {
  var index = 0;
  var _this = this;
  return {
    next() {
      return index < _this.length
        ? {value: _this[index++], done: false}
        : {value: undefined, done: true};
    },
  };
}

for (let v of obj) {
  console.log(v);//1 2 3
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值