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
...Но если массивоподобный объект имеет специальное свойство `Symbol.isConcatSpreadable`, то он обрабатывается `concat` как массив: вместо него добавляются его элементы:
184
+
...Но если объект имеет специальное свойство `Symbol.isConcatSpreadable`, то он обрабатывается `concat` как массив: вместо него добавляются его элементы:
Copy file name to clipboardExpand all lines: 1-js/05-data-types/06-iterable/article.md
+13-15Lines changed: 13 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,11 +1,11 @@
1
1
2
2
# Итерируемые объекты
3
3
4
-
*Итерируемые* (или *перебираемые*) объекты - это применение принципов работы массивов к другим объектам. Эта концепция позволяет использовать любой объект в цикле `for..of`.
4
+
*Итерируемые* (или *перебираемые*) объекты - это концепция, которая позволяет использовать любой объект в цикле `for..of`.
5
5
6
-
Конечно же, сами массивы являются итерируемыми объектами. Но есть и много других встроенных итерируемых объектов. Например, строки тоже можно перебирать. Как мы увидим далее, работа многих встроенных операторов и методов основана на них.
6
+
Конечно же, сами массивы являются перебираемыми объектами. Но есть и много других встроенных перебираемыми объектов, например, строки.
7
7
8
-
Если объект представляет собой коллекцию, то можно использовать `for..of` для её перебора, даже если это не массив. Давайте посмотрим, как это сделать.
8
+
Если объект не является массивом, но представляет собой коллекцию каких-то элементов, то удобно использовать цикл `for..of` для их перебора, так что давайте посмотрим, как этого достичь.
9
9
10
10
## Symbol.iterator
11
11
@@ -25,14 +25,14 @@ let range = {
25
25
// for(let num of range) ... num=1,2,3,4,5
26
26
```
27
27
28
-
Чтобы сделать `range` итерируемым (и позволить ему работать в`for..of`), нам нужно добавить в объект метод с именем `Symbol.iterator` (специальный встроенный `Symbol`, созданный как раз для этого).
28
+
Чтобы сделать `range` итерируемым (и позволить с ним работать`for..of`), нам нужно добавить в объект метод с именем `Symbol.iterator` (специальный встроенный `Symbol`, созданный как раз для этого).
29
29
30
30
1. Когда цикл `for..of` запускается, он вызывает этот метод один раз (или выдаёт ошибку, если метод не найден). Этот метод должен вернуть *итератор* -- объект с методом `next`.
31
31
2. Дальше, `for..of` работает *только с этим возвращённым объектом*.
32
32
3. Когда `for..of` хочет получить следующее значение, он вызывает метод `next()` этого объекта.
33
-
4. Результат вызова `next()` должен иметь вид `{done: Boolean, value: any}`, где `done=true` означает, что итерация закончена, в противном случае `value`должен содержать следующее значение.
33
+
4. Результат вызова `next()` должен иметь вид `{done: Boolean, value: any}`, где `done=true` означает, что итерация закончена, в противном случае `value`содержит очередное значение.
34
34
35
-
Вот полная реализация `range`:
35
+
Вот полная реализация `range` с пояснениями:
36
36
37
37
```js run
38
38
let range = {
@@ -67,10 +67,10 @@ for (let num of range) {
67
67
}
68
68
```
69
69
70
-
Обратите внимание на ключевую особенность итераторов: разделение ответственности:
70
+
Обратите внимание на ключевую особенность итераторов: разделение ответственности.
71
71
72
72
- У самого `range` нет метода `next()`.
73
-
- Вместо этого другой объект, так называемый "итератор", создаётся вызовом `range[Symbol.iterator]()`, и именно он управляет всей итерацией.
73
+
- Вместо этого другой объект, так называемый "итератор", создаётся вызовом `range[Symbol.iterator]()`, и именно его `next()` генерирует значения.
74
74
75
75
Таким образом, итератор отделен от самого итерируемого объекта.
76
76
@@ -115,9 +115,9 @@ for (let num of range) {
115
115
```
116
116
117
117
118
-
## Строка - итерируемый объект
118
+
## Строка - перебираемый объект
119
119
120
-
Среди встроенных итерируемых объектов наиболее широко используются массивы и строки.
120
+
Среди встроенных перебираемых объектов наиболее широко используются массивы и строки.
121
121
122
122
Для строки `for..of` перебирает символы:
123
123
@@ -128,7 +128,7 @@ for (let char of "test") {
128
128
}
129
129
```
130
130
131
-
Работает корректно даже с суррогатными парами!
131
+
И он работает корректно даже с суррогатными парами!
132
132
133
133
```js run
134
134
let str ='𝒳😂';
@@ -139,9 +139,7 @@ for (let char of str) {
139
139
140
140
## Явный вызов итератора
141
141
142
-
Обычно внутреннее устройство итерируемых объектов спрятано от внешнего кода. Есть цикл `for..of`, он работает, и это все, что нужно извне.
143
-
144
-
Но чтобы понять устройство итераторов чуть глубже, давайте посмотрим как создать итератор явно.
142
+
Чтобы понять устройство итераторов чуть глубже, давайте посмотрим как их использовать явно.
145
143
146
144
Мы будем перебирать строку в точности так же, как цикл `for..of`, но вручную, прямыми вызовами. Код ниже получает строковой итератор и получает из него значения:
147
145
@@ -282,7 +280,7 @@ let str = '𝒳😂𩷶';
282
280
283
281
alert( slice(str, 1, 3) ); // 😂𩷶
284
282
285
-
// встроенный метод не поддерживает суррогатные пары
283
+
//а вот встроенный метод не поддерживает суррогатные пары
286
284
alert( str.slice(1, 3) ); // мусор (две части различных суррогатных пар)
0 commit comments