Что такое псевдомассив arguments в JavaScript?
Что проверяют
Знаете ли вы, чем массивоподобный объект отличается от массива, и понимаете ли, почему arguments сегодня почти не нужен. Вопрос старый, и отвечать на него надо в современных терминах: иначе он читается как признак знаний, которые давно не обновлялись.
Как отвечать
arguments доступен внутри обычной функции и содержит все переданные аргументы, включая те, что не объявлены в сигнатуре. У него есть length, доступ по индексу и перебор, но методов массива нет: это объект, похожий на массив, а не массив.
Превратить в массив можно расширением или преобразованием из перебираемого:
function old() {
const args = [...arguments];
return args.reduce((a, b) => a + b, 0);
}
function modern(...values) {
return values.reduce((a, b) => a + b, 0);
}Современная замена это остаточные параметры. Разница существенная: получается настоящий массив, он работает в стрелочных функциях и собирает только аргументы после объявленных.
Что стоит добавить: у стрелочной функции своего arguments нет, обращение уйдёт во внешнюю область видимости. В нестрогом режиме элементы связаны с именованными параметрами, и запись в один меняет другой, а в строгом режиме и в функциях с параметрами по умолчанию, остаточными или с деструктуризацией связь разорвана. arguments.length считает фактически переданное, а length самой функции считает объявленное до первого необязательного параметра.
Где спотыкаются
Зовут map, filter или slice прямо на arguments и получают ошибку. Сначала преобразование в массив, и лучше сразу остаточный параметр.
Используют arguments внутри стрелочной функции. Значение либо приходит из внешней функции и выглядит правдоподобно, либо падает ошибкой обращения к необъявленному имени, и оба случая ищутся долго.
Опираются на связь с именованными параметрами. Поведение зависит от режима и от вида параметров, так что один и тот же приём в двух функциях даёт разный результат.