В ECMAScript6 iterator - объект с методом next()
, который возвращает объект с двумя свойствами: {value, done}
. Например .:Почему нам нужны итерационные и итераторные концепции?
function createIterator(ra) {
let i = 0;
return {
next() {
if (i < ra.length)
return {value: ra[i++],
done: false};
else
return {value: undefined,
done: true};
}
};
}
Создав итератор один находит это не очень полезно в своем собственном праве, как нет встроенного синтаксиса, чтобы воспользоваться итератора. Вместо этого нужно делать такие вещи, как:
const it = createIterator(['a', 'b', 'c']);
while (true) {
const o = it.next();
if (o.done)
break;
else
console.log(o.value);
}
«Iterable» с другой стороны, является объектом с Symbol.iterator
собственности, которая должна быть функция без аргументов, который возвращает итератор:
function createIterable(ra) {
let it = createIterator(ra);
return {
[Symbol.iterator]() {return it;}
};
}
... и когда мы создаем итератор мы наконец-то сможем использовать for of
синтаксис:
for (let v of createIterable(['a', 'b', 'c']))
console.log(v);
Глядя на приведенный выше код на добавленную стоимость «Iterable» объекта над «итератором» нелегко воспринимается. Итак, зачем Javascript нужны эти две отдельные концепции итератора итератора? Кстати, это то, что Java does as well, поэтому должна быть какая-то независимая от языка причина, почему это хорошая идея иметь эти две разные концепции.
Итератор должен использовать 'yield', а не' return'. Итераторы реализуют ленивую оценку, например, генераторы Python и, да, Java. Итераторы - это просто способ стандартизировать, как вы перебираете объекты - это происходит из C++, где итераторы предназначены для стандартизации итерации по объектам, где неясно, к чему перебирать. Там есть мир разницы. –
Понятно, что «итератор» обертывает текущее состояние операции итерации, а «итерируемый» символ отмечает коллекцию как способную обеспечить итератор. – Alnitak
@ Итераторы и итераторы AkshatMahajan стоят само по себе. Генераторы (в этом отношении) просто удобны. –