Как использовать arguments в JavaScript?
Что проверяют
Знаете ли вы, что это не массив, и понимаете ли, почему в новом коде его заменили остаточные параметры.
Как отвечать
arguments это массивоподобный объект, доступный внутри обычной функции. Содержит все переданные аргументы, независимо от того, сколько параметров объявлено.
function sum() {
return Array.from(arguments).reduce((a, b) => a + b, 0);
}
sum(1, 2, 3); // 6Особенности, которые надо назвать:
- это не массив. Есть
lengthи доступ по индексу, но нетmap,filter,reduce. Преобразуют черезArray.from(arguments)или[...arguments]; - в стрелочных функциях его нет. Обращение внутри стрелки возьмёт
argumentsиз внешней обычной функции, а если её нет, получится ошибка; - в нестрогом режиме он связан с параметрами: изменение
arguments[0]меняет значение первого параметра и наоборот. В строгом режиме и в модулях эта связь разорвана, что делает поведение предсказуемым; - мешает оптимизации: обращение к
argumentsисторически усложняло работу оптимизирующего компилятора.
В современном коде вместо него используют остаточные параметры:
const sum = (...nums) => nums.reduce((a, b) => a + b, 0);Преимущества очевидны: это настоящий массив со всеми методами, работает в стрелочных функциях, виден прямо в сигнатуре, и можно взять только часть аргументов после именованных (function f(first, ...rest)).
Вывод для собеседования: arguments полезно знать, чтобы читать старый код и понимать, откуда берутся странные эффекты в нестрогом режиме, но писать новый код с ним не стоит.
Где спотыкаются
Вызывают arguments.map и получают ошибку.
Ищут arguments внутри стрелочной функции.
Не знают про связь с параметрами в нестрогом режиме.
Используют его в новом коде вместо остаточных параметров.