链接地址

  1. 迭代器

    迭代器是一个对象,知道如何每次访问集合中的一项,并跟踪该序列中的当前位置。它提供一个next()方法,用来返回序列中的下一项。这个方法返回包含两个属性:donevalue

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //创建一个迭代器对象

    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
  1. 生成器

    迭代器需要显式地维护其内部状态,生成器允许自定义一个包含自有迭代算法的函数,同时它可以自动维护自己的状态。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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
  2. 可迭代对象

    为了实现可迭代,一个对象必须实现@@iterator方法,就是说这个对象或其原型链中的一个对象必须具有带Symbol.iterator键的属性。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
        var myIterable = {};
    myIterable[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
    };

    for (let value of myIterable) {
    console.log(value);
    }

    // 1
    // 2
    // 3

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

    4. 高级生成器

    The next() 方法也接受可用于修改生成器内部状态的值。传递给next()的值将被视为暂停生成器的最后一个yield表达式的结果。

    ```javascript
    使用 next(x) 重新启动 fibonacci 序列生成器:

    function* fibonacci() {
    var fn1 = 0;
    var fn2 = 1;
    while(true) {
    var current = fn1;
    fn1 = fn2;
    fn2 = current + fn1;
    var reset = yield current;
    if (reset) {
    fn1 = 0;
    fn2 = 1;
    }
    }
    }

    var sequence = fibonacci();
    console.log(sequence.next().value); // 0
    console.log(sequence.next().value); // 1
    console.log(sequence.next().value); // 1
    console.log(sequence.next().value); // 2
    console.log(sequence.next().value); // 3
    console.log(sequence.next().value); // 5
    console.log(sequence.next().value); // 8
    console.log(sequence.next(true).value); // 0
    console.log(sequence.next().value); // 1
    console.log(sequence.next().value); // 1
    console.log(sequence.next().value); // 2