0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Давайте попробуем реализовать очень простую функцию, суммирующую числа. Для начала определим функцию sum(), принимающую на вход два числа и возвращающую их сумму:</p>
1
<p>Давайте попробуем реализовать очень простую функцию, суммирующую числа. Для начала определим функцию sum(), принимающую на вход два числа и возвращающую их сумму:</p>
2
<p>Пока всё просто и понятно. Сложности возникают при дополнительных требованиях: что, если захотим суммировать не два, а три числа? Или пять, или даже десять? Писать для обработки каждого случая отдельную функцию - очевидно плохой вариант:</p>
2
<p>Пока всё просто и понятно. Сложности возникают при дополнительных требованиях: что, если захотим суммировать не два, а три числа? Или пять, или даже десять? Писать для обработки каждого случая отдельную функцию - очевидно плохой вариант:</p>
3
<p>Надо, чтобы единая функция могла работать с разным количеством аргументов. Как это сделать?</p>
3
<p>Надо, чтобы единая функция могла работать с разным количеством аргументов. Как это сделать?</p>
4
<p>Можно заметить, что в стандартной библиотеке JavaScript существуют функции, которые могут принимать разное количество аргументов. Например, сигнатура функции<a>Math.max()</a>определяется так:</p>
4
<p>Можно заметить, что в стандартной библиотеке JavaScript существуют функции, которые могут принимать разное количество аргументов. Например, сигнатура функции<a>Math.max()</a>определяется так:</p>
5
<p>Она говорит нам о том, что в Math.max() можно передать любое количество элементов и они не обязательны:</p>
5
<p>Она говорит нам о том, что в Math.max() можно передать любое количество элементов и они не обязательны:</p>
6
<p>С точки зрения вызова - ничего необычного, просто разное число аргументов. А вот определение функции с переменным числом аргументов выглядит необычно:</p>
6
<p>С точки зрения вызова - ничего необычного, просто разное число аргументов. А вот определение функции с переменным числом аргументов выглядит необычно:</p>
7
<p>Символ многоточия ... перед именем формального параметра в определении функции обозначает rest-оператор. Запись ...params в определении func() из примера выше означает буквально следующее: "все переданные при вызове функции аргументы поместить в массив params".</p>
7
<p>Символ многоточия ... перед именем формального параметра в определении функции обозначает rest-оператор. Запись ...params в определении func() из примера выше означает буквально следующее: "все переданные при вызове функции аргументы поместить в массив params".</p>
8
<p>Если вовсе не передать аргументов, то массив params будет пустым:</p>
8
<p>Если вовсе не передать аргументов, то массив params будет пустым:</p>
9
<p>В функцию можно передать любое количество аргументов - все они попадут в массив params:</p>
9
<p>В функцию можно передать любое количество аргументов - все они попадут в массив params:</p>
10
<p>Аргументы могут быть любого типа - числа, строки, массивы и др.:</p>
10
<p>Аргументы могут быть любого типа - числа, строки, массивы и др.:</p>
11
<p>Теперь у нас достаточно знаний, чтобы с помощью rest-оператора переписать нашу функцию sum() так, чтобы она умела суммировать любое количество чисел (а не только два числа, как сейчас):</p>
11
<p>Теперь у нас достаточно знаний, чтобы с помощью rest-оператора переписать нашу функцию sum() так, чтобы она умела суммировать любое количество чисел (а не только два числа, как сейчас):</p>
12
<p>В таком контексте массив можно считать как "необязательные аргументы", которые можно либо вовсе не передавать, либо передавать столько, сколько хочешь. А что, если мы захотим, чтобы функция имела два обыкновенных ("обязательных") именованных параметра, а остальные были необязательными и сохранялись в rest-массиве? Всё просто: при определении функции сначала указываем стандартные именованные формальные параметры (например, a и b) и в конце добавляем rest-массив:</p>
12
<p>В таком контексте массив можно считать как "необязательные аргументы", которые можно либо вовсе не передавать, либо передавать столько, сколько хочешь. А что, если мы захотим, чтобы функция имела два обыкновенных ("обязательных") именованных параметра, а остальные были необязательными и сохранялись в rest-массиве? Всё просто: при определении функции сначала указываем стандартные именованные формальные параметры (например, a и b) и в конце добавляем rest-массив:</p>
13
<p>То же можно сделать и для одного аргумента:</p>
13
<p>То же можно сделать и для одного аргумента:</p>
14
<p>и для трёх:</p>
14
<p>и для трёх:</p>
15
<p>Эту идею можно продолжать и дальше, делая обязательными то количество аргументов, которое требуется. Единственное ограничение: rest-оператор может быть использован только для последнего параметра. То есть такой код синтаксически неверен:</p>
15
<p>Эту идею можно продолжать и дальше, делая обязательными то количество аргументов, которое требуется. Единственное ограничение: rest-оператор может быть использован только для последнего параметра. То есть такой код синтаксически неверен:</p>
16
<p>И такой тоже:</p>
16
<p>И такой тоже:</p>
17
<p>Именно поэтому оператор называется<em>rest</em>, то есть он организует хранение "остальных" ("оставшихся", последних) параметров.</p>
17
<p>Именно поэтому оператор называется<em>rest</em>, то есть он организует хранение "остальных" ("оставшихся", последних) параметров.</p>