> Как собрать неопределённое количество аргументов функции в 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)); // 6
console.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) - работает, но менее наглядно.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью