iterator/iterable和generator

iterator/iterable和generator

iterator

一个包含next方法的对象,返回一个包含value和done的对象。

function makeIterator(array) {
  var nextIndex = 0;
  return {
    next: function () {
      return nextIndex < array.length ? {
        value: array[nextIndex++],
        done: false
      } : {
        done: true
      };
    }
  };
}

var it = makeIterator(['yo', 'ya']);
console.log(it.next().value); // 'yo'
console.log(it.next().value); // 'ya'
console.log(it.next().done);  // true
iterable

一个实现了Symbol.iterator属性的对象,称为可迭代对象。

var myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

for (let value of myIterable) {
  console.log(value);
}
// 1
// 2
// 3

//or

console.log([...myIterable]); // [1, 2, 3]
generator

一个可以维护自己状态的迭代器工厂函数。

function* idMaker() {
  var index = 0;
  while(true)
    yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2

看下面这个例子:

let arr = [1, 2, 3];

/*
  generator函数用来简化以前自己写next方法
  它可以自己维护自己的状态
*/
function* gen(arr) {
  for (let x of arr) {
    yield x;
  }
}

function makeIterator(arr) {
  let nextIndex = 0;
  return {
    [Symbol.iterator]: function() {
      return this;
    },
    next: function() {
      return nextIndex < array.length ?
        {value: array[nextIndex++], done: false} :
        {value: undefined, done: true};
    }
  }
}

/*
  一个对象包含Symbol.iterator,表示它iterable
  iterable用来区分普通对象及包含ymbol.iterator的对象
*/
let iterable = gen(arr);
console.log(iterable[Symbol.iterator]);
/*
  迭代器用来遍历所有属性
*/
let iterator = iterable[Symbol.iterator]();
console.log(iterator === iterable);

let iterable2 = makeIterator(arr);
console.log(iterable2[Symbol.iterator]);
let iterator2 = iterable2[Symbol.iterator]();
console.log(iterator2 === iterable2);

/*
[Function: [Symbol.iterator]]
true
[Function: [Symbol.iterator]]
true
*/

也就是说:

gen生成的generator对象,既是一个iterable的对象,又是一个iterator。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值