Итераторы в JavaScript

Jun 30, 2018

Итерируемый объект

Iterable - итерируемый или перебираемый объект.

Итерируемый объект - у итерируемого объекта есть специальный метод [Symbol.iterator](), который возвращает объект (который называется итератором); у итератора есть метод next(). Метод next возвращает объект с двумя свойствами done и value.

Вы можете перебрать все значения итерируемого объекта при помощи for. Примером итерируемого объекта является: массив, строка, коллекция DOM-элементов.

this[Symbol.iterator] : Iterator

    //Возвращает итератор для этого объекта
// Arrays are a built in Iterable object
var arr = ['a', 'b', 'c'];

// Use for (... of ...) loop to get the values of an iterable
for (var x of arr) {
    console.log(x);
}

// Under the covers, for (... of ...) does the following: 
var iterator = arr[Symbol.iterator]();
var current = iterator.next();
while (!current.done) {
    console.log(current.value);
    current = iterator.next();
}

/*
    a
    b
    c
    a
    b
    c
*/

Создадим объект и определим в нем итератор вручную

В стандарте есть конкретные требования к объектам, который возвращаются. Итак, создадим итерируемый объект с использованием стандарта:

let idGenerator = {
    [Symbol.iterator]() {
        let id = 1;

        return {
            next() {
                let value = id > 6 ? undefined : id++;
                let done  = !value;
                return {
                    value,
                    done
                }
            }
        }
    }
};

for (let id of idGenerator) {
    console.log("id: ", id);
}
/*
    id:  1
    id:  2
    id:  3
    id:  4
    id:  5
    id:  6
*/

    //https://jsfiddle.net/dnzl/tzb6ocdj/

Итератор

В JavaScript итератор - это объект, который предоставляет метод next(), возвращающий следующий элемент последовательности. Этот метод возвращает объект с двумя свойствами: done и value.

Вы можете использовать for(var value of iterator) {}, чтобы перебрать значения в итераторе.

Вызов функции-генератора (function*() {}) возвратит итератор.

Итераторы на javascripture.com

Метод экземпляра

next([yieldValue : Object]) : Object
    return : {
        value	Object
        done	Boolean
    }

Пример на jsfiddle

https://jsfiddle.net/dnzl/tzb6ocdj/embed/js/dark/
Добавить комментарий