> Как собрать неопределённое количество аргументов функции в JavaScript и работать с ними (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
В JavaScript для сбора неопределённого количества аргументов используются rest parameters (...args) в объявлении функции, а также псевдомассив arguments внутри обычных функций. Rest parameters - современный и предпочтительный способ, так как возвращают настоящий массив, в отличие от arguments, который является объектом, подобным массиву. Для работы с arguments требуется преобразование через Array.from() или spread-оператор. В стрелочных функциях arguments недоступен, поэтому там rest parameters - единственный вариант.
Подробное объяснение
Rest parameters появились в ES6 и синтаксически выглядят как троеточие перед последним именованным параметром: function foo(a, b, ...rest). Они собирают все переданные аргументы, начиная с позиции, где объявлены, в настоящий массив. Это значит, что к ним применимы все методы массива: map, filter, reduce, forEach и так далее.
Псевдомассив arguments доступен только в обычных функциях (не стрелочных) и содержит все переданные аргументы, включая те, что соответствуют именованным параметрам. У него есть свойство length и индексы, но нет методов массива. Для преобразования используют Array.from(arguments) или [...arguments].
Ключевое различие: rest parameters собирают только "лишние" аргументы, а arguments - все без исключения. Также rest parameters нельзя использовать вместе с arguments в одной функции - это взаимоисключающие подходы, хотя технически arguments всё равно существует.
Ещё один нюанс: rest parameters должны быть последними в списке параметров, иначе будет синтаксическая ошибка. Дефолтные значения параметров не влияют на работу rest - они применяются только к именованным параметрам.
На практике
В реальной фронтенд-разработке rest parameters часто используются для:
- функций-обёрток, которые передают произвольное количество аргументов дальше;
- реализации функций типа
composeилиpipeв функциональном программировании; - обработки динамического списка элементов в UI-компонентах (например, передача произвольного набора классов или стилей);
- создания функций логирования с переменным числом параметров.
При работе с arguments в старом коде нужно помнить о его связи с внешней функцией - внутри вложенных функций arguments будет ссылаться на их собственные аргументы, а не на внешние. Это частая причина багов при рефакторинге.
Пример кода
JAVASCRIPT// Rest parameters - современный подходfunction sum(...numbers) {return numbers.reduce((acc, num) => acc + num, 0);}console.log(sum(1, 2, 3)); // 6console.log(sum()); // 0// С именованными параметрамиfunction log(level, ...messages) {console.log(`[${level}]`, ...messages);}log('info', 'user', 'logged in'); // [info] user logged in// Псевдомассив arguments (устаревший подход)function oldSum() {const args = Array.from(arguments);return args.reduce((acc, num) => acc + num, 0);}console.log(oldSum(1, 2, 3, 4)); // 10// В стрелочной функции arguments недоступенconst arrowSum = (...numbers) => numbers.reduce((acc, n) => acc + n, 0);console.log(arrowSum(5, 10, 15)); // 30
Как отвечать на собеседовании
Начните с упоминания rest parameters как основного инструмента, затем кратко сравните с arguments. Покажите понимание различий: массив против псевдомассива, доступность в стрелочных функциях, поведение с именованными параметрами. Приведите пример использования в реальной задаче, например, в функции-обёртке или при работе с динамическими данными. Упомяните ограничение - rest parameters должны быть последними. Если спросят про производительность, отметьте, что разница незначительна, но rest parameters чище и предсказуемее.
Что проверяет интервьюер
Интервьюер оценивает:
- знание современного синтаксиса ES6+ и умение отличать его от устаревших подходов;
- понимание разницы между массивом и псевдомассивом;
- осведомлённость о поведении
argumentsво вложенных функциях и стрелочных функциях; - способность применить rest parameters в практической задаче, а не просто воспроизвести определение;
- внимание к деталям: позиция rest parameters, взаимодействие с дефолтными значениями.
Типичные ошибки
- Использование
argumentsв стрелочной функции - приводит к ReferenceError. - Попытка вызвать методы массива напрямую на
arguments-arguments.mapне существует. - Объявление rest parameters не последним параметром - синтаксическая ошибка.
- Забывают, что rest parameters собирают только "лишние" аргументы, а не все.
- Путают rest parameters со spread-оператором - это разные конструкции, хотя синтаксис одинаковый.
- В старом коде используют
Array.prototype.slice.call(arguments)вместо более читаемогоArray.from(arguments)- работает, но менее наглядно.
> Похожие задачи по frontend
Что возвращает метод filter в JavaScript, если ни один элемент не подходит под условие
Как работает функция groupBy в JavaScript
Каков порядок выполнения синхронных задач, микротасков и макротасков в JavaScript
Что должен возвращать колбэк в методе sort в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью