> Почему у объекта arguments в JavaScript нет метода shift (JavaScript, TypeScript)

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

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

Стек: JavaScript, TypeScript

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

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

arguments - это array-like объект, а не настоящий массив. У него есть свойство length и доступ по индексу, но он не наследует методы из Array.prototype, включая shift. Это историческое решение в спецификации ECMAScript: объект arguments был создан как простой объект для экономии производительности, а не как полноценный массив.

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

Объект arguments появился в JavaScript ещё до того, как в языке появились настоящие массивы с методами. Он был спроектирован как легковесная структура, предоставляющая доступ к переданным аргументам через индексы и свойство length. Наследование от Array.prototype потребовало бы дополнительных накладных расходов на поддержку методов, которые для arguments не были критичны.

В современном JavaScript (ES6+) arguments считается устаревшим в пользу rest-параметров (...args), которые уже являются настоящим массивом. Однако для обратной совместимости поведение arguments остаётся неизменным.

Если вам нужно использовать методы массива на arguments, вы можете преобразовать его в массив явно: Array.from(arguments) или [...arguments].

На практике

В реальной разработке на TypeScript или современном JavaScript вы почти никогда не используете arguments напрямую. Вместо этого применяются rest-параметры:

TYPESCRIPT
function logAll(...args: string[]) {
args.shift(); // работает, потому что args - массив
console.log(args);
}

Если вы работаете с легаси-кодом, где используется arguments, конвертируйте его в массив перед вызовом методов:

TYPESCRIPT
function legacyFunction() {
const args = Array.from(arguments);
const first = args.shift();
}

Пример кода

JAVASCRIPT
// Не работает
function test() {
arguments.shift(); // TypeError: arguments.shift is not a function
}
// Работает
function test() {
const args = Array.from(arguments);
args.shift(); // ок
}
// Современный подход
function test(...args) {
args.shift(); // ок
}

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

Начните с ключевого факта: arguments - это array-like объект, а не массив. Объясните, что он не наследует Array.prototype. Упомяните исторические причины (экономия производительности, ранние версии JS). Затем покажите, как решить проблему на практике - через Array.from или rest-параметры. Для уровня senior важно добавить, что в современном коде arguments не используется, и предпочтительнее rest-параметры.

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

  • Понимание разницы между array-like объектами и настоящими массивами
  • Знание прототипного наследования в JavaScript
  • Осведомлённость об эволюции языка (ES5 vs ES6+)
  • Умение применять современные альтернативы (rest-параметры)
  • Понимание, как работает Array.from и spread-оператор

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

  • Утверждение, что arguments - это массив (это не так)
  • Попытка вызвать методы массива без преобразования
  • Использование arguments в стрелочных функциях (там он не определён)
  • Забывание, что Array.from и [...arguments] создают поверхностную копию
  • Путаница между arguments и arguments.callee (устаревшее свойство)

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

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