Skip to content

Latest commit

 

History

History
81 lines (64 loc) · 2.27 KB

迭代器与生成器.md

File metadata and controls

81 lines (64 loc) · 2.27 KB

可迭代对象(Iterable)

定义:有迭代行为的对象。为了实现可迭代,一个对象必须实现 @@iterator 方法,这意味着这个对象(或其原型链中的任意一个对象)必须具有一个带 Symbol.iterator 键(key)的属性。

内置可迭代对象:Map, set, string, array, TypedArray...

// 自定义可迭代对象
var myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

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

// 或者

[...myIterable]; // [1, 2, 3]

迭代器(@@iterator)

迭代器定义:迭代器是通过使用 next() 方法实现 Iterator protocol 的任何一个对象。在每次迭代中,next() 方法能返回一个无参函数<()=>{ done, value }>

function makeRangeIterator(start = 0, end = Infinity, step = 1) {
    let nextIndex = start;
    let iterationCount = 0;

    const rangeIterator = {
       next: function() {
           let result;
           if (nextIndex < end) {
               result = { value: nextIndex, done: false }
               nextIndex += step;
               iterationCount++;
               return result;
           }
           return { value: iterationCount, done: true }
       }
    };
    return rangeIterator;
}

生成器(Generator函数)

生成器产生背景:使用迭代器,需要显式地维护其内部状态(done, value, next()),因此需要谨慎地创建。

生成器定义:一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。

语法:*function() => { yeild result } / asycn function() => { await result }

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}

异步事件的演进

可迭代协议 & 迭代器协议

参考文献

  1. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Iterators_and_Generators