| JavaScript: ...rest против arguments |
|
| Добавил(а) microsin | ||||||||||||||||||
|
Передача в функцию параметров через arguments или ...rest на языке JavaScript: в чем отличие? Отличие между `arguments` и `...rest` (остаточные параметры) — это отличие устаревшего массиво-подобного объекта (array-like object) от настоящего современного массива. Вот ключевые различия: 1. Тип данных (самое важное) arguments — это массиво-подобный объект (iterable object). У него есть индекс [0], [1] и свойство length, но нет методов массива (map, filter, reduce, forEach, pop и т. д). ...rest — это настоящий массив (Array). С ним можно работать напрямую, используя все встроенные методы. // arguments (НЕ массив) 2. Синтаксис объявления `arguments` доступен внутри любой функции (кроме стрелочных) без явного объявления. Он просто существует. `...rest` нужно явно указывать в списке параметров функции, ставя три точки перед именем (`...args`), и он должен быть последним параметром. // OK: rest последний 3. Работа в стрелочных функциях - `arguments` в стрелочных функциях не работает (выдаст ошибку или ссылку на внешнюю функцию, если она есть). - `...rest` отлично работает в стрелочных функциях, так как это обычный параметр. const arrowOld = () => { 4. Влияние на длину функции (свойство `.length`) - `arguments` не влияет на официальное количество ожидаемых параметров. - `...rest` не учитывается в свойстве `length` функции (считаются только явные параметры до него). function a(a, b) { console.log(arguments.length); } a.length; // 2 (ожидаем 2 параметра) 5. Работа с частичными параметрами `arguments` захватывает все переданные аргументы без исключений. `...rest` захватывает только "остаток" (излишек) аргументов, позволяя выделить первые несколько параметров по имени. function show(first, second, ...rest) { Итоговая таблица:
Что использовать в 2026 году? Всегда используйте `...rest`. `arguments` оставлен только для поддержки старого кода. Если вам вдруг понадобилось использовать `arguments` (например, в легаси-коде) и нужно применить метод массива, делайте преобразование: function legacy() { Но лучше просто переписать функцию на `(...args)`. [Синтаксис ...spread] Ранее было показано поведение оператора ...rest (остаточные параметры), но для передачи параметров функцию также существует ...spread (оператор расширения). Визуально они выглядят одинаково (три точки), но решают прямо противоположные задачи. И это иногда вызывает путаницу в понимании. Давайте четко разграничим: ...rest (остаточные параметры) — собирает элементы в массив Где используется: в объявлении функции, в списке параметров. Задача: взять «оставшиеся» аргументы и сложить их в настоящий массив. // REST — собирает разрозненные аргументы в кучу (массив) ...spread (оператор расширения) — разворачивает массив на отдельные элементы Где используется: при вызове функции, в литералах массивов/объектов. Задача: взять массив (или объект) и «распаковать» его содержимое наружу. // SPREAD — разворачивает массив в список значений Яркие примеры использования ...spread: 1. Вызов функции с массивом вместо списка аргументов const scores = [10, 20, 30]; 2. Создание нового массива (копирование / объединение) const arr1 = [1, 2]; 3. Создание нового объекта (копирование / слияние) const user = { name: 'Alex', age: 25 }; 4. Сравнение в одном месте (функция) Самый частый вопрос на собеседованиях: // REST — в ОБЪЯВЛЕНИИ функции (слева от =>) 5. Еще один трюк (превращение строки в массив) const str = 'Hello'; Коротко для запоминания: ...rest (в параметрах) = «Я возьму всё лишнее и положу в массив». Если увидели три точки внутри скобок ( ) — это rest. Если увидели три точки внутри [ ] или { } или при вызове — это spread. |