> Как преобразовать объект arguments в массив в JavaScript (JavaScript, TypeScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Яндекс

Стек: JavaScript, TypeScript

> Пример ответа

Короткий ответ

Объект arguments можно преобразовать в массив несколькими способами: Array.prototype.slice.call(arguments), Array.from(arguments) или с помощью spread-оператора [...arguments]. В современном JavaScript предпочтительнее использовать Array.from() или spread-оператор, так как они более читаемы и не требуют привязки контекста. В TypeScript и современном JS лучше избегать arguments, используя rest-параметры.

Подробное объяснение

Объект arguments - это array-like объект, доступный внутри функций (кроме стрелочных). Он имеет свойство length и индексированные элементы, но не имеет методов массива, таких как map, filter, reduce. Для работы с ним как с массивом требуется преобразование.

Основные методы преобразования:

  1. Array.prototype.slice.call(arguments) - классический способ, работает во всех версиях JS. Использует метод slice из прототипа Array, привязывая к нему arguments через call.

  2. Array.from(arguments) - современный метод (ES6), создаёт новый массив из итерируемого или array-like объекта. Более читаемый и производительный.

  3. Spread-оператор [...arguments] - работает только с итерируемыми объектами. arguments является итерируемым в современном JS, но не во всех окружениях (например, в старых браузерах).

  4. Array.prototype.concat.apply([], arguments) - альтернативный, но менее распространённый способ.

В TypeScript и современном JavaScript рекомендуется использовать rest-параметры вместо arguments: function foo(...args: any[]). Это даёт настоящий массив с типизацией.

На практике

В реальных проектах выбор метода зависит от контекста:

  • Для поддержки старых браузеров (IE11) используйте Array.prototype.slice.call.
  • В современном коде (ES6+) предпочтительнее Array.from - он явно показывает намерение преобразовать array-like объект.
  • Spread-оператор удобен в простых случаях, но может быть менее производительным при больших объёмах данных.
  • В TypeScript и современном JS избегайте arguments полностью - используйте rest-параметры.

Пример кода

JAVASCRIPT
// Старый способ (ES3+)
function oldWay() {
var args = Array.prototype.slice.call(arguments);
return args.map(x => x * 2);
}
// Современный способ (ES6+)
function modernWay() {
const args = Array.from(arguments);
return args.filter(x => x > 0);
}
// С использованием spread (ES6+)
function spreadWay() {
const args = [...arguments];
return args.reduce((sum, x) => sum + x, 0);
}
// Рекомендуемый подход в современном JS/TS
function recommendedWay(...args) {
return args.map(x => x.toString());
}
// Пример с TypeScript
function typedWay(...args: number[]): number[] {
return args.filter(x => x % 2 === 0);
}

Как отвечать на собеседовании

Начните с краткого перечисления способов, затем объясните различия. Упомяните, что arguments - это array-like, а не массив, и почему это важно. Покажите понимание производительности: Array.from обычно быстрее spread-оператора для больших объектов. Обязательно скажите, что в современной разработке лучше использовать rest-параметры - это и есть правильный ответ для senior-уровня. Приведите пример, когда arguments всё ещё может быть полезен (например, при работе с декораторами или legacy-кодом).

Что проверяет интервьюер

Интервьюер оценивает:

  • Понимание разницы между array-like и массивом
  • Знание эволюции JavaScript (от ES3 до ES6+)
  • Умение выбирать правильный инструмент под контекст
  • Осведомлённость о современных практиках (rest-параметры вместо arguments)
  • Понимание ограничений: arguments не работает в стрелочных функциях
  • Знание TypeScript-специфики (типизация rest-параметров)

Типичные ошибки

  • Использование Array.prototype.slice.call в современном коде без необходимости
  • Попытка вызвать методы массива напрямую на arguments (приводит к TypeError)
  • Использование spread-оператора в контексте, где arguments может быть неитерируемым (старые окружения)
  • Забывание, что arguments не доступен в стрелочных функциях
  • Использование arguments в TypeScript без явного указания типа (any по умолчанию)
  • Путаница между Array.from и Array.of (первый преобразует, второй создаёт массив из аргументов)

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

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