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
**In chapter 01-06-02 rest-parameters-spread**
Some of sentences were correct, but they were "unnatural" in Ukrainian and make understanding more difficult.
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/02-rest-parameters-spread/article.md
+44-44Lines changed: 44 additions & 44 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,15 +6,15 @@
6
6
7
7
-`Math.max(arg1, arg2, ..., argN)` -- повертає найбільший з аргументів.
8
8
-`Object.assign(dest, src1, ..., srcN)` -- копіює властивості з `src1..N` до `dest`.
9
-
- ...і багато ще.
9
+
- ...і багато інших.
10
10
11
-
У цьому розділі ми дізнаємось, як зробити те саме. А також, як передати масиви таким функціям, як параметри.
11
+
У цьому розділі ми дізнаємось, як зробити те саме в власній функції. А також, як передати таким функціям в якості параметрів масиви.
12
12
13
-
## Залишкові параметри `...`
13
+
## Залишкові параметри `...` (з англ. rest parameters)
14
14
15
-
Функцію можна викликати з будь-якою кількістю аргументів, незалежно від того, як вона визначена.
15
+
Функцію можна викликати з будь-якою кількістю аргументів, незалежно від того, як вона оголошена.
16
16
17
-
Як тут:
17
+
Як от тут:
18
18
```js run
19
19
functionsum(a, b) {
20
20
return a + b;
@@ -23,9 +23,9 @@ function sum(a, b) {
23
23
alert(sum(1, 2, 3, 4, 5));
24
24
```
25
25
26
-
Помилки "надмірних" аргументів у цьому випадку не буде. Але, звичайно, будуть враховані лише перші два, тому результатом у коді вище є `3`.
26
+
Помилки із-за "надмірних" аргументів у цьому випадку не буде. Але, звісно ж, враховані будуть лише перші два, тому результатом у коді вище є `3`.
27
27
28
-
Решту параметрів можна включити до визначення функції за допомогою трьох крапок `...`що передують імені масиву, який їх міститиме. Точки буквально означають "зібрати решту параметрів у масив".
28
+
Решту параметрів можна включити до визначення функції за допомогою трьох крапок `...`і після них ім'я масив, в який вони передадуться. Точки буквально означають "зібрати решту параметрів у масив".
29
29
30
30
Наприклад, щоб зібрати всі аргументи в масив `args`:
31
31
@@ -43,7 +43,7 @@ alert( sumAll(1, 2) ); // 3
43
43
alert( sumAll(1, 2, 3) ); // 6
44
44
```
45
45
46
-
Ми можемо вибрати перші параметри як змінні, а зібрати у масив лише залишки.
46
+
Ми можемо вказати щоб перші параметри отримувались як аргументи, а в масив пішли всі інші.
47
47
48
48
У цьому прикладі перші два аргументи переходять у змінні, а решта -- в масив `titles`:
За старих часів залишкові параметри не існували в мові, єдиний спосіб отримати всі аргументи функції був за допомогою `arguments`. І він все ще працює, ми можемо знайти його в старому коді.
99
+
В стародавні часи такої можливості як залишкові параметри в JavaScript не існувало. Тому єдиним способом отримати всі аргументи функції було за допомогою `arguments`. І він все ще працює, ми можемо знайти його в старому коді.
100
100
101
-
Але недоліком є те, що хоча`arguments` є одночасно масивом і ітерабельним, це не масив. Він не підтримує методи масиву, тому ми не можемо наприклад викликати `arguments.map(...)`.
101
+
Але недоліком є те, що хоч`arguments` є одночасно і псевдомасивом, і ітеровуваним (перебираваним) об'єктом, та все ж це об'єкт, а не масив. Він не підтримує методи масиву, тому ми не можемо наприклад викликати `arguments.map(...)`.
102
102
103
-
Крім того, він завжди містить усі аргументи. Ми не можемо отримати їх частково, як це було зроблено з параметрами залишку.
103
+
Крім того, він завжди містить усі аргументи. Ми не можемо отримати лише частину з них, як це можна робити з допомогою залишкових параметрів.
104
104
105
-
Тому, коли нам потрібні вбудовані методи, тоді краще використати параметри залишку.
105
+
Тому, коли нам потрібні вбудовані методи масивів, тоді краще використати залишкові параметри.
106
106
107
-
````smart header="Стрілочні функції не мають `\"arguments\"`"
108
-
Якщо ми викличемо `arguments` об'єкта із стрілочною функцією, він візьме їх із зовнішньої "звичайної" функції.
107
+
````smart header="Стрíлкові функції не мають `\"arguments\"`"
108
+
Якщо ми викличемо `arguments` об'єкта всередині стрíлкової функції, він візьме їх із зовнішньої "звичайної" функції.
109
109
110
110
Ось приклад:
111
111
@@ -118,13 +118,13 @@ function f() {
118
118
f(1); // 1
119
119
```
120
120
121
-
Як ми пам’ятаємо, стрілочні функції не мають власних `this`. Тепер ми знаємо, що у них також немає особливого об'єкту `arguments`.
121
+
Як ми пам’ятаємо, стрíлкові функції не мають власних `this`. Тепер ми знаємо, що у них також немає особливого об'єкту `arguments`.
122
122
````
123
123
124
124
125
-
## Синтаксис розширення [#spread-syntax]
125
+
## Синтаксис розширення [#spread-syntax] (з англ. spread syntax)
126
126
127
-
Ми тільки що побачили, як отримати масив зі списку параметрів.
127
+
Ми щойно побачили, як отримати масив зі списку параметрів.
128
128
129
129
Але іноді нам потрібно зробити зворотнє.
130
130
@@ -134,7 +134,7 @@ f(1); // 1
134
134
alert( Math.max(3, 5, 1) ); // 5
135
135
```
136
136
137
-
Тепер припустимо, що у нас є масив `[3, 5, 1]`. Як нам викликати `Math.max` з цим?
137
+
Тепер припустімо, що у нас є масив `[3, 5, 1]`. Як нам викликати `Math.max` з цим?
138
138
139
139
Передати "як є" не вийде, бо `Math.max` очікує список числових аргументів, а не єдиний масив:
140
140
@@ -146,11 +146,11 @@ alert( Math.max(arr) ); // NaN
146
146
*/!*
147
147
```
148
148
149
-
І, звісно ж, ми не можемо вручну перераховувати елементи в коді `Math.max(arr[0], arr[1], arr[2])`, тому що ми можемо не знати, скільки їх існує. Під час виконання нашого сценарію їх може бути багато, а може і не бути. І це було б потворно.
149
+
І, звісно ж, ми не можемо вручну перераховувати елементи в коді `Math.max(arr[0], arr[1], arr[2])`, тому що ми можемо й не знати, скільки їх існує. Під час виконання нашого сценарію їх може бути багато, а може і не бути. Та й взагалі робити це вручну було б жахливо.
150
150
151
151
Нам допоможе *синтаксис розширення*! Він схожий на параметри залишку, також використовуються `...`, але працює все навпаки.
152
152
153
-
Коли `...arr` використовується у виклику функції, він "розширює" повторюванний об'єкт `arr` до списку аргументів.
153
+
Коли `...arr` використовується в дужках при виклику функції, він "розширює" ітеровуваний об'єкт `arr` до списку аргументів.
154
154
155
155
Для `Math.max`:
156
156
@@ -189,10 +189,10 @@ let arr2 = [8, 9, 15];
189
189
let merged = [0, ...arr, 2, ...arr2];
190
190
*/!*
191
191
192
-
alert(merged); // 0,3,5,1,2,8,9,15 (0, then arr, then 2, then arr2)
192
+
alert(merged); // 0,3,5,1,2,8,9,15 (0, тоді arr, тоді 2, тоді arr2)
193
193
```
194
194
195
-
У наведених вище прикладах ми використовували масив для демонстрації синтаксису розширення, але підходить будь-який повторюванний об'єкт.
195
+
У наведених вище прикладах для демонстрації синтаксису розширення ми використовували масив, але підходить будь-який ітеровуваний (перебираваний) об'єкт.
196
196
197
197
Наприклад, тут ми використовуємо синтаксис розширення, щоб перетворити рядок у масив символів:
198
198
@@ -202,32 +202,32 @@ let str = "Hello";
202
202
alert( [...str] ); // H,e,l,l,o
203
203
```
204
204
205
-
Синтаксис розширення внутрішньо використовує ітератори для збору елементів так само, як це робить `for..of`.
205
+
Синтаксис розширення під капотом працює з перебираваними об'єктами так само, як це робить `for..of`.
206
206
207
-
Отже, для рядка, `for..of` повертає символи так само `...str` повертає `"H","e","l","l","o"`. Список символів передається в ініціалізатор масиву `[...str]`.
207
+
Отже, для рядка, `for..of` повертає символи й `...str` перетворюється в `"H","e","l","l","o"`. Список символів передається в ініціалізатор масиву `[...str]`.
208
208
209
-
Для цього конкретного завдання ми також могли б використовувати `Array.from`, тому що він перетворює ітерабельний об'єкт (як рядок) на масив:
209
+
Для цього конкретного завдання ми також могли б використовувати `Array.from`, бо він перетворює перебираваний об'єкт (то й же рядок, або щось інше) на масив:
210
210
211
211
```js run
212
212
let str = "Hello";
213
213
214
-
// Array.from перетворює ітерабельний об'єкт в масив
214
+
// Array.from перетворює перебираваний об'єкт в масив
215
215
alert( Array.from(str) ); // H,e,l,l,o
216
216
```
217
217
218
-
Результат такий самий як `[...str]`.
218
+
Результат такий самий як при `[...str]`.
219
219
220
220
Але між `Array.from(obj)` та `[...obj]` є тонка різниця:
221
221
222
-
- `Array.from` працює як з масиво-подібними об'єктами, так і з об'єктами, що ітеруються.
223
-
- Синтаксис розширення працює тільки з ітераторами.
222
+
- `Array.from` працює як з псевдомасивами, так і з перебираваними об'єктами.
223
+
- Синтаксис розширення працює тільки з перебираваними об'єктами.
224
224
225
-
Отже, для завдання перетворити щось на масив `Array.from` буде більш універсальним.
225
+
Отже, якщо треба перетворити щось на масив, то `Array.from` буде більш універсальним.
226
226
227
227
228
228
## Створити копію масива/об’єкта
229
229
230
-
Пригадайте, коли ми говорили `Object.assign()` [в минулому розділі](info:object-copy#cloning-and-merging-object-assign)?
230
+
Пам'ятаєте ми раніше говорили про `Object.assign()` [в минулому розділі](info:object-copy#cloning-and-merging-object-assign)?
231
231
232
232
Те ж саме можна зробити і з синтаксисом розширення.
Цей спосіб копіювання об’єкта набагато коротший, ніж `let objCopy = Object.assign({}, obj)` чи для масиву `let arrCopy = Object.assign([], arr)` тому ми вважаємо за краще використовувати його, коли це можливо.
276
+
Цей спосіб копіювання об’єкта набагато коротший, ніж `let objCopy = Object.assign({}, obj)` чи для масиву `let arrCopy = Object.assign([], arr)`. Тому ми вважаємо за краще використовувати його, коли це можливо.
277
277
278
278
279
279
## Підсумки
280
280
281
-
Коли ми бачимо `"..."` у коді це або залишкові параметри, або синтаксис розширення.
281
+
Коли ми бачимо `"..."` у коді - це або залишкові параметри, або синтаксис розширення.
282
282
283
283
Існує простий спосіб відрізнити їх:
284
284
285
-
- Коли `...` находиться в кінці параметрів функції, це "залишкові параметри" і він збирає решту переданих аргументів у масив.
285
+
- Коли `...` знаходиться в кінці параметрів функції, це "залишкові параметри" і він збирає решту переданих аргументів у масив.
286
286
- Коли `...` виникає під час виклику функції чи чогось подібного, це називається "синтаксисом розширення" і розширює масив у список.
287
287
288
-
Використовуйте паттерни:
288
+
Паттерни використання:
289
289
290
290
- Залишкові параметри використовуються для створення функцій, які приймають будь-яку кількість аргументів.
291
291
- Синтаксис розширення використовується для передачі масиву у функції, які зазвичай вимагають список із багатьох аргументів.
292
292
293
293
Разом вони допомагають легко переміщатися між списком та масивом параметрів.
294
294
295
-
Усі аргументи виклику функції також доступні в "олдскульному" ітерабельному об’єкті `arguments`.
295
+
Усі аргументи виклику функції також доступні в "олдскульному" ітеровуваному об’єкті `arguments`.
0 commit comments