Modern JS Cheatsheet / Памятка по современному JavaScript: Оператор расширения "..."
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
### Оператор расширения "..." wizjer 02.10.17 в 05:33 |
|
|
Оператор расширения "...", появившийся в ES2015, предназначен для раскрытия итерируемых объектов (например, массивов) там, где может поместиться несколько элементов таких объектов. Tomatoknight 02.10.17 в 19:22 |
||
|
#### Пример кода Tomatoknight 02.10.17 в 19:23 |
||
|
const n = { x, y, ...z }; Tomatoknight 02.10.17 в 19:23 |
||
|
#### Объяснение Tomatoknight 02.10.17 в 19:23 |
||
|
##### В итерируемых объектах (наподобие массивов) Tomatoknight 02.10.17 в 19:23 |
||
|
Если у нас есть два массива: Tomatoknight 02.10.17 в 19:23 |
||
|
```js Tomatoknight 02.10.17 в 19:24 |
||
|
Первый элемент массива *arr2* - это массив, потому что *arr1* напрямую вставляется в *arr2*. Но мы хотим, чтобы *arr2* состоял только из букв. Чтобы добиться этого, мы можем *расширить* элементы массива *arr1* в массив *arr2*. Tomatoknight 02.10.17 в 19:25 |
||
|
С использованием оператора расширения Tomatoknight 02.10.17 в 19:26 |
||
|
```js Tomatoknight 02.10.17 в 19:26 |
||
|
Оставшиеся параметры функции Tomatoknight 02.10.17 в 19:26 |
||
|
##### Мы можем использовать оператор оставшихся параметров функции, чтобы вставить параметры в массив, элементы которого можно перебрать при помощи цикла. К каждой функции уже привязан объект **arguments** - это массив, состоящий из всех параметров, переданных функции. Tomatoknight 02.10.17 в 19:30 |
||
|
```js Tomatoknight 02.10.17 в 19:31 |
||
|
Но давайте представим, что мы хотим, чтобы наша функция создала нового студента, у которого будут отдельные оценки и средний балл. Удобнее будет записать первые два параметра в две отдельные переменные, а все оценки поместить в массив, который можно перебирать. Tomatoknight 02.10.17 в 19:34 |
||
|
Именно это позволяет нам сделать оператор оставшихся параметров! Tomatoknight 02.10.17 в 19:35 |
||
|
```js Tomatoknight 02.10.17 в 19:36 |
||
|
const avgGrade = grades.reduce((acc, curr) => acc + curr, 0) / grades.length; // Высчитывает из всех оценок средний балл Tomatoknight 02.10.17 в 19:36 |
||
|
return { Tomatoknight 02.10.17 в 19:36 |
||
|
const student = createStudent("Коля", "Андреев", 10, 12, 6); Tomatoknight 02.10.17 в 19:37 |
||
|
> **Примечание:** createStudent - плохая функция, потому что мы не проверяем, существует ли grades.length и отличается ли от 0. Но так функцию легче прочитать, поэтому я этот случай не рассматриваю. Tomatoknight 02.10.17 в 19:38 |
||
|
##### Расширение свойств объектов Tomatoknight 02.10.17 в 19:38 |
||
|
Чтобы понять эту часть, рекомендую прочитать предыдущие объяснения о применении оператора оставшихся параметров к функциям и итерируемым объектам. Tomatoknight 02.10.17 в 19:39 |
||
|
```js Tomatoknight 02.10.17 в 19:40 |
||
|
// z - это остаток деструктурированного объекта: myObj минус деструктурированные свойства х и у. Tomatoknight 02.10.17 в 19:41 |
||
|
const n = { x, y, ...z }; Tomatoknight 02.10.17 в 19:41 |
||
|
// Здесь свойства объекта z расширяются в n Tomatoknight 02.10.17 в 19:41 |
||
|
#### Внешние ресурсы Tomatoknight 02.10.17 в 19:41 |
||
|
- [TC39 - Объекты, расширение и оставшиеся параметры](https://github.com/tc39/proposal-object-rest-spread) Tomatoknight 02.10.17 в 19:42 |
