--- 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 (оператор "раскрывает" массив в список аргументов) ```