> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/e-controls/e3-generators/08-generator-iterator.md).

# 08. Generators as Iterators

Вызов генератора можно использовать везде, где можно использовать итератор:

Генераторы можно использовать в цикле `for..of`

```javascript
let generator = generateSequence();
for (let value of generator) {
  console.log(value); // 1, затем 2, затем 3
}
```

При помощи оператора `spread` можно разложить генератор в последовательность:

```javascript
let generator = generateSequence();
let resArray = [...generator];
```

На генераторе можно использовать деструктуризацию:

```javascript
const [x, y] = generateSequence();
```

Если исполнение генератора добирается до `return result`, то генератор возвращает значение `{ value: result, done: true }`.&#x20;

Большинство конструкций с итераторами игнорируют это значение, если `done: true`

```javascript
function* genFuncWithReturn() {
  yield "a";
  yield "b";
  return "The result";
}

for (const x of genFuncWithReturn()) {
  console.log(x);
}
// Output:
// a
// b

const arr = [...genFuncWithReturn()]; // ['a', 'b']
```

`yield*`, an operator for making recursive generator calls, does consider values inside `done` objects. The result of `yield*` is the end-of-iteration value:

```javascript
function* logReturned(genObj) {
  const result = yield* genObj;
  console.log("res = ", result); // (A)
}

[...logReturned(genFuncWithReturn())];
// res = The result
// [ 'a', 'b' ]
```
