Skip to content

Commit fa437e1

Browse files
authored
Merge pull request #709 from Andrii256/01-06-02-rest-parameters-spread
Fix rest-parameters-spread (01-06-02)
2 parents 56d3bd7 + 9ee6c5e commit fa437e1

File tree

1 file changed

+43
-43
lines changed
  • 1-js/06-advanced-functions/02-rest-parameters-spread

1 file changed

+43
-43
lines changed

1-js/06-advanced-functions/02-rest-parameters-spread/article.md

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66

77
- `Math.max(arg1, arg2, ..., argN)` -- повертає найбільший з аргументів.
88
- `Object.assign(dest, src1, ..., srcN)` -- копіює властивості з `src1..N` до `dest`.
9-
- ...і багато ще.
9+
- ...і багато інших.
1010

11-
У цьому розділі ми дізнаємось, як зробити те саме. А також, як передати масиви таким функціям, як параметри.
11+
У цьому розділі ми дізнаємось, як зробити те саме у власній функції. А також, як передавати таким функціям масиви як параметри.
1212

13-
## Залишкові параметри `...`
13+
## Залишкові параметри `...` (з англ. "Rest Parameters")
1414

15-
Функцію можна викликати з будь-якою кількістю аргументів, незалежно від того, як вона визначена.
15+
Функцію можна викликати з будь-якою кількістю аргументів, незалежно від того, як вона оголошена.
1616

17-
Як тут:
17+
Як от тут:
1818
```js run
1919
function sum(a, b) {
2020
return a + b;
@@ -23,9 +23,9 @@ function sum(a, b) {
2323
alert(sum(1, 2, 3, 4, 5));
2424
```
2525

26-
Помилки "надмірних" аргументів у цьому випадку не буде. Але, звичайно, будуть враховані лише перші два, тому результатом у коді вище є `3`.
26+
Помилки із-за "надмірних" аргументів у цьому випадку не буде. Але, звісно ж, враховані будуть лише перші два, тому результатом у коді вище є `3`.
2727

28-
Решту параметрів можна включити до визначення функції за допомогою трьох крапок `...` що передують імені масиву, який їх міститиме. Точки буквально означають "зібрати решту параметрів у масив".
28+
Решту переданих параметрів можна можна зібрати разом за допомогою трьох крапок `...` і після них ім'я змінної з масивом, в який вони передадуться. Ці три крапки буквально означають "зібрати решту параметрів у масив".
2929

3030
Наприклад, щоб зібрати всі аргументи в масив `args`:
3131

@@ -43,7 +43,7 @@ alert( sumAll(1, 2) ); // 3
4343
alert( sumAll(1, 2, 3) ); // 6
4444
```
4545

46-
Ми можемо вибрати перші параметри як змінні, а зібрати у масив лише залишки.
46+
Ми можемо задати щоб перші два аргументи мали свої персональні змінні, а в масив пішли всі решта.
4747

4848
У цьому прикладі перші два аргументи переходять у змінні, а решта -- в масив `titles`:
4949

@@ -62,7 +62,7 @@ showName("Юлій", "Цезар", "Консул", "Полководець");
6262
```
6363

6464
````warn header="Залишкові параметри повинні бути в кінці"
65-
Залишкові параметри збирають усі залишені аргументи, тому наступне не має сенсу та викликає помилку:
65+
Залишкові параметри збирають усі додаткові аргументи, тому такий код не спрацює і викличе помилку:
6666
6767
```js
6868
function f(arg1, ...rest, arg2) { // arg2 після ...rest ?!
@@ -75,7 +75,7 @@ function f(arg1, ...rest, arg2) { // arg2 після ...rest ?!
7575

7676
## Змінна "arguments"
7777

78-
Існує також спеціальний об’єкт, подібний масиву `arguments` який містить усі аргументи за їх індексом.
78+
Існує також спеціальний псевдомасив, об'єкт `arguments`, який містить усі аргументи з їх індексами.
7979

8080
Наприклад:
8181

@@ -85,27 +85,27 @@ function showName() {
8585
alert(arguments[0]);
8686
alert(arguments[1]);
8787

88-
// це повторюване
88+
// ми можемо ітерувати по ньому, код нижче працюватиме
8989
// for(let arg of arguments) alert(arg);
9090
}
9191

92-
// показує: 2, Julius, Caesar
93-
showName("Julius", "Caesar");
92+
// показує: 2, Юлій, Цезар
93+
showName("Юлій", "Цезар");
9494

95-
// показує: 1, Ilya, undefined (жодного другого аргументу)
96-
showName("Ilya");
95+
// показує: 1, Ілля, undefined (другого аргументу немає)
96+
showName("Ілля");
9797
```
9898

99-
За старих часів залишкові параметри не існували в мові, єдиний спосіб отримати всі аргументи функції був за допомогою `arguments`. І він все ще працює, ми можемо знайти його в старому коді.
99+
В стародавні часи такої можливості як залишкові параметри в JavaScript не існувало. Тому єдиним способом отримати всі аргументи функції було за допомогою `arguments`. І він все ще працює, ми можемо знайти його в старому коді.
100100

101-
Але недоліком є те, що хоча `arguments` є одночасно масивом і ітерабельним, це не масив. Він не підтримує методи масиву, тому ми не можемо наприклад викликати `arguments.map(...)`.
101+
Але недоліком є те, що хоч `arguments` є одночасно і псевдомасивом, і ітерованим об'єктом, та все ж це об'єкт, а не масив. Він не підтримує методи масиву, тому ми не можемо наприклад викликати `arguments.map(...)`.
102102

103-
Крім того, він завжди містить усі аргументи. Ми не можемо отримати їх частково, як це було зроблено з параметрами залишку.
103+
Крім того, він завжди містить усі аргументи. Ми не можемо отримати лише частину з них, як це можна робити з допомогою залишкових параметрів.
104104

105-
Тому, коли нам потрібні вбудовані методи, тоді краще використати параметри залишку.
105+
Тому, коли нам потрібні вбудовані методи масивів, тоді краще використати залишкові параметри.
106106

107-
````smart header="Стрілочні функції не мають `\"arguments\"`"
108-
Якщо ми викличемо `arguments` об'єкта із стрілочною функцією, він візьме їх із зовнішньої "звичайної" функції.
107+
````smart header="Стрілкові функції не мають `\"arguments\"`"
108+
Якщо ми спробуємо звернутись до об'єкта `arguments` всередині стрілкової функції, то отримаємо його з зовнішньої "звичайної" функції.
109109

110110
Ось приклад:
111111

@@ -118,13 +118,13 @@ function f() {
118118
f(1); // 1
119119
```
120120

121-
Як ми пам’ятаємо, стрілочні функції не мають власних `this`. Тепер ми знаємо, що у них також немає особливого об'єкту `arguments`.
121+
Як ми пам’ятаємо, стрілкові функції не мають власних `this`. Тепер ми знаємо, що в них також немає особливого об'єкту `arguments`.
122122
````
123123
124124
125-
## Синтаксис розширення [#spread-syntax]
125+
## Синтаксис розширення [#spread-syntax] (з англ. "Spread Syntax")
126126
127-
Ми тільки що побачили, як отримати масив зі списку параметрів.
127+
Ми щойно побачили, як отримати масив зі списку параметрів.
128128
129129
Але іноді нам потрібно зробити зворотнє.
130130
@@ -134,7 +134,7 @@ f(1); // 1
134134
alert( Math.max(3, 5, 1) ); // 5
135135
```
136136
137-
Тепер припустимо, що у нас є масив `[3, 5, 1]`. Як нам викликати `Math.max` з цим?
137+
Тепер припустімо, що у нас є масив `[3, 5, 1]`. Як нам викликати `Math.max` з цим?
138138
139139
Передати "як є" не вийде, бо `Math.max` очікує список числових аргументів, а не єдиний масив:
140140
@@ -146,11 +146,11 @@ alert( Math.max(arr) ); // NaN
146146
*/!*
147147
```
148148
149-
І, звісно ж, ми не можемо вручну перераховувати елементи в коді `Math.max(arr[0], arr[1], arr[2])`, тому що ми можемо не знати, скільки їх існує. Під час виконання нашого сценарію їх може бути багато, а може і не бути. І це було б потворно.
149+
І, звісно ж, ми не можемо вручну перераховувати елементи в коді `Math.max(arr[0], arr[1], arr[2])`, тому що ми можемо й не знати, скільки їх існує. Під час виконання нашого сценарію їх може бути багато, а може і не бути. Та й взагалі робити це вручну було б дивно і неефективно.
150150
151151
Нам допоможе *синтаксис розширення*! Він схожий на параметри залишку, також використовуються `...`, але працює все навпаки.
152152
153-
Коли `...arr` використовується у виклику функції, він "розширює" повторюванний об'єкт `arr` до списку аргументів.
153+
Коли `...arr` використовується в дужках підчас виклику функції, він "розширює" ітеровуваний об'єкт `arr` до списку аргументів.
154154
155155
Для `Math.max`:
156156
@@ -189,10 +189,10 @@ let arr2 = [8, 9, 15];
189189
let merged = [0, ...arr, 2, ...arr2];
190190
*/!*
191191
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)
193193
```
194194
195-
У наведених вище прикладах ми використовували масив для демонстрації синтаксису розширення, але підходить будь-який повторюванний об'єкт.
195+
У наведених вище прикладах для демонстрації синтаксису розширення ми використовували масив, але підходить будь-який ітерований об'єкт.
196196
197197
Наприклад, тут ми використовуємо синтаксис розширення, щоб перетворити рядок у масив символів:
198198
@@ -202,32 +202,32 @@ let str = "Hello";
202202
alert( [...str] ); // H,e,l,l,o
203203
```
204204
205-
Синтаксис розширення внутрішньо використовує ітератори для збору елементів так само, як це робить `for..of`.
205+
Синтаксис розширення під капотом працює з ітерованими об'єктами так само, як це робить `for..of`.
206206
207-
Отже, для рядка, `for..of` повертає символи так само `...str` повертає `"H","e","l","l","o"`. Список символів передається в ініціалізатор масиву `[...str]`.
207+
Отже, для рядка, `for..of` повертає символи так само як і `...str`, врешті-решт рядок перетворюється на `"H","e","l","l","o"`. Список символів передається в ініціалізатор масиву `[...str]`.
208208
209-
Для цього конкретного завдання ми також могли б використовувати `Array.from`, тому що він перетворює ітерабельний об'єкт (як рядок) на масив:
209+
Для цього конкретного завдання ми також могли б використовувати `Array.from`, бо він перетворює ітерований об'єкт (то й же рядок, або щось інше) на масив:
210210
211211
```js run
212212
let str = "Hello";
213213
214-
// Array.from перетворює ітерабельний об'єкт в масив
214+
// Array.from перетворює ітерований об'єкт на масив
215215
alert( Array.from(str) ); // H,e,l,l,o
216216
```
217217
218-
Результат такий самий як `[...str]`.
218+
Результат такий самий як при `[...str]`.
219219
220220
Але між `Array.from(obj)` та `[...obj]` є тонка різниця:
221221
222-
- `Array.from` працює як з масиво-подібними об'єктами, так і з об'єктами, що ітеруються.
223-
- Синтаксис розширення працює тільки з ітераторами.
222+
- `Array.from` працює як з псевдомасивами, так і з ітерованими об'єктами.
223+
- Синтаксис розширення працює тільки з ітерованими об'єктами.
224224
225-
Отже, для завдання перетворити щось на масив `Array.from` буде більш універсальним.
225+
Отже, якщо треба перетворити щось на масив, то `Array.from` буде більш універсальним.
226226
227227
228228
## Створити копію масива/об’єкта
229229
230-
Пригадайте, коли ми говорили `Object.assign()` [в минулому розділі](info:object-copy#cloning-and-merging-object-assign)?
230+
Пам'ятаєте ми раніше говорили про `Object.assign()` [в минулому розділі](info:object-copy#cloning-and-merging-object-assign)?
231231
232232
Те ж саме можна зробити і з синтаксисом розширення.
233233
@@ -273,23 +273,23 @@ alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4}
273273
alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3}
274274
```
275275
276-
Цей спосіб копіювання об’єкта набагато коротший, ніж `let objCopy = Object.assign({}, obj)` чи для масиву `let arrCopy = Object.assign([], arr)` тому ми вважаємо за краще використовувати його, коли це можливо.
276+
Цей спосіб копіювання об’єкта набагато коротший, ніж `let objCopy = Object.assign({}, obj)` чи для масиву `let arrCopy = Object.assign([], arr)`. Тому ми вважаємо за краще використовувати його, коли це можливо.
277277
278278
279279
## Підсумки
280280
281-
Коли ми бачимо `"..."` у коді це або залишкові параметри, або синтаксис розширення.
281+
Коли ми бачимо `"..."` у коді -- це або залишкові параметри, або синтаксис розширення.
282282
283283
Існує простий спосіб відрізнити їх:
284284
285-
- Коли `...` находиться в кінці параметрів функції, це "залишкові параметри" і він збирає решту переданих аргументів у масив.
285+
- Коли `...` знаходиться в кінці параметрів функції, це "залишкові параметри" і він збирає решту переданих аргументів у масив.
286286
- Коли `...` виникає під час виклику функції чи чогось подібного, це називається "синтаксисом розширення" і розширює масив у список.
287287
288-
Використовуйте паттерни:
288+
Паттерни використання:
289289
290290
- Залишкові параметри використовуються для створення функцій, які приймають будь-яку кількість аргументів.
291291
- Синтаксис розширення використовується для передачі масиву у функції, які зазвичай вимагають список із багатьох аргументів.
292292
293293
Разом вони допомагають легко переміщатися між списком та масивом параметрів.
294294
295-
Усі аргументи виклику функції також доступні в "олдскульному" ітерабельному об’єкті `arguments`.
295+
Усі аргументи виклику функції також доступні в "олдскульному" ітерованому об’єкті `arguments`.

0 commit comments

Comments
 (0)