---
sidebar_position: 5
---

# Остаточные параметры и оператор расширения

Когда мы видим "..." в коде, это могут быть как остаточные параметры, так и оператор расширения.

Как отличить их друг от друга:

- Если ... располагается в конце списка параметров функции, то это «остаточные параметры». Он собирает остальные неуказанные аргументы и делает из них массив.
- Если ... встретился в вызове функции или где-либо ещё, то это «оператор расширения». Он извлекает элементы из массива.

Полезно запомнить:
- Остаточные параметры используются, чтобы создавать новые функции с неопределённым числом аргументов.
- С помощью оператора расширения можно вставить массив в функцию, которая по умолчанию работает с обычным списком аргументов.
- 
Вместе эти конструкции помогают легко преобразовывать наборы значений в массивы и обратно.

К аргументам функции можно обращаться и по-старому — через псевдомассив arguments.

## Остаточные параметры (...)
Остаточные параметры могут быть обозначены через три точки `....`
```js
function sumAll(...args) { // args — имя массива
  let sum = 0;
  for (let arg of args) sum += arg;
  return sum;
}
alert( sumAll(1) ); // 1
alert( sumAll(1, 2) ); // 3
alert( sumAll(1, 2, 3) ); // 6
```
💥 ***Остаточные параметры должны располагаться в конце***
```js
function f(arg1, ...rest, arg2) { // arg2 после ...rest ?!
  // Ошибка
}
```
## Переменная "arguments"
Все аргументы функции находятся в псевдомассиве `arguments` под своими порядковыми номерами.
Хотя arguments похож на массив, и его тоже можно перебирать, это всё же не массив. Методы массивов не поддерживаются.
```js
function showName() {
  alert( arguments.length );
  alert( arguments[0] );
  alert( arguments[1] );
  // for (let arg of arguments) alert(arg); // Объект arguments можно перебирать
}
showName("Юлий", "Цезарь"); // Вывод: 2, Юлий, Цезарь
showName("Илья");// Вывод: 1, Илья, undefined (второго аргумента нет)
```
💥 ***Стрелочные функции не имеют "arguments"***
Если мы обратимся к arguments из стрелочной функции, то получим аргументы внешней «нормальной» функции.

## Оператор расширения
Когда `...arr` используется при вызове функции, он «расширяет» перебираемый объект `arr` в список аргументов.
```js
let arr = [3, 5, 1];
alert( Math.max(...arr) ); // 5 (оператор "раскрывает" массив в список аргументов)
```

🚀 **Источник: [https://learn.javascript.ru/rest-parameters-spread-operator](https://learn.javascript.ru/rest-parameters-spread-operator)**