You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/10-es-modern/9-iterator/article.md
+10-10Lines changed: 10 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@
17
17
18
18
let arr = [1, 2, 3]; // массив — пример итерируемого объекта
19
19
20
-
for(let value of arr) {
20
+
for(let value of arr) {
21
21
alert(value); // 1, затем 2, затем 3
22
22
}
23
23
```
@@ -28,7 +28,7 @@ for(let value of arr) {
28
28
//+ run
29
29
'use strict';
30
30
31
-
for(let char of"Привет") {
31
+
for(let char of"Привет") {
32
32
alert(char); // Выведет по одной букве: П, р, и, в, е, т
33
33
}
34
34
```
@@ -44,7 +44,7 @@ for(let char of "Привет") {
44
44
45
45
Допустим, у нас есть некий объект, который надо "умным способом" перебрать.
46
46
47
-
Например, `range` -- диапазон чисел от `from` до `to`, и мы хотим, чтобы `for(let num of range)` "перебирал", этот объект. При этом под перебором мы подразумеваем перечисление чисел от `from` до `to`.
47
+
Например, `range` -- диапазон чисел от `from` до `to`, и мы хотим, чтобы `for(let num of range)` "перебирал" этот объект. При этом под перебором мы подразумеваем перечисление чисел от `from` до `to`.
48
48
49
49
Объект `range` без итератора:
50
50
@@ -55,7 +55,7 @@ let range = {
55
55
};
56
56
57
57
// хотим сделать перебор
58
-
// for(let num of range) ...
58
+
// for(let num of range) ...
59
59
```
60
60
61
61
Для возможности использовать объект в `for..of` нужно создать в нём свойство с названием `Symbol.iterator` (системный символ).
@@ -64,7 +64,7 @@ let range = {
64
64
65
65
По стандарту у такого объекта должен быть метод `next()`, который при каждом вызове возвращает очередное значение и окончен ли перебор.
<li>У итератора должен быть метод `next()`, который при каждом вызове возвращает объект со свойствами:
113
113
<ul>
114
114
<li>`value` -- очередное значение,
115
-
<li>`done` -- равно `false`, если есть ещё значения, и `true` -- в конце.</li>
115
+
<li>`done` -- равно `false` если есть ещё значения, и `true` -- в конце.</li>
116
116
</ul>
117
117
</li>
118
118
</ul>
119
119
120
120
Конструкция `for..of` в начале своего выполнения автоматически вызывает `Symbol.iterator()`, получает итератор и далее вызывает метод `next()` до получения `done: true`. Такова внутренняя механика. Внешний код при переборе через `for..of` видит только значения.
121
121
122
-
Такое отделение функционала перебора от самого объекта даёт дополнительную гибкость, например, объект может возвращать разные итераторы в зависимости от своего настроения и времени суток. Однако, бывают ситуации, когда оно не нужно.
122
+
Такое отделение функционала перебора от самого объекта даёт дополнительную гибкость. Например, объект может возвращать разные итераторы в зависимости от своего настроения и времени суток. Однако, бывают ситуации когда оно не нужно.
123
123
124
124
Если функционал по перебору (метод `next`) предоставляется самим объектом, то можно вернуть `this` в качестве итератора:
<li>*Итератор* -- объект, предназначенный для перебора другого объекта.</li>
220
-
<li>У итератора должен быть метод `next()`, возвращающий `{done: Boolean, value: any}`, где `value` -- очередное значение, а `done: true` в конце.</li>
220
+
<li>У итератора должен быть метод `next()`, возвращающий объект `{done: Boolean, value: any}`, где `value` -- очередное значение, а `done: true` в конце.</li>
221
221
<li>Метод `Symbol.iterator` предназначен для получения итератора из объекта. Цикл `for..of` делает это автоматически, но можно и вызвать его напрямую.</li>
222
222
<li>В современном стандарте есть много мест, где вместо массива используются более абстрактные "итерируемые" (со свойством `Symbol.iterator`) объекты, например оператор spread `...`.</li>
223
223
<li>Встроенные объекты, такие как массивы и строки, являются итерируемыми, в соответствии с описанным выше.</li>
0 commit comments