logo

Сбор аргументов функции в один объект: альтернатива func_get_args

Быстрый ответ

Да, вы можете собрать все аргументы функции в один объект с использованием оператора распространения ... и функции Object.assign():

JS
Скопировать код
function collectArgs(...args) {
  return {...args};
}

// Пример использования:
let argsObj = collectArgs('яблоко', 'банан', 'вишня');
console.log(argsObj); 
// { "0": "яблоко", "1": "банан", "2": "вишня" }

В данном примере массив args преобразуется в новый объект с использованием синтаксиса {...args}, включающий в себя все переданные аргументы.

О рест-операторах и операторах расширения

Рест-операторы и операторы расширения, обозначаемые как ..., это инструменты, которые позволяют собирать и распределять аргументы функции.

Рест-операторы: параметры функции 'готовые к работе в любой момент'

Рест-операторы (...) дают возможность собрать неопределённое количество аргументов функции в массив, что обеспечивает более гибкую работу с ними.

JS
Скопировать код
function sum(...numbers) {
  return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3)); // Выведет 6

Объект arguments: похож на массив, но ним не является

Объект arguments предлагает доступ ко всем аргументам функции, что возможно в функциях, не являющихся стрелочными.

JS
Скопировать код
function exampleFunction() {
  console.log(arguments[0]); // Первый аргумент
}

exampleFunction('Привет!', 'Как дела?'); // Выведет 'Привет!'

Чтобы применить методы массива к arguments, его необходимо преобразовать в массив:

JS
Скопировать код
function exampleFunction() {
  const argsArray = Array.from(arguments);
  console.log(argsArray[0]); 
}

exampleFunction('Привет!', 'Расслабляемся'); // Выведет 'Привет!'

Вкалывание

Представьте функцию как фотографа (function), который делает групповое фото (object) вас и вашей семьи (arguments). Каждый член семьи становится составляющей общего фотографического портрета.

JS
Скопировать код
function captureFamilyPhoto(...familyMembers) {
    const family = { ...familyMembers };
    console.log(family);
}

captureFamilyPhoto('Алиса', 'Боб', 'Чарли');
Markdown
Скопировать код
До: Члены семьи по отдельности: ['Алиса', 'Боб', 'Чарли']
После: Все вместе на групповом фото: { '0':'Алиса', '1':'Боб', '2':'Чарли' }

Гибкость применения

Стрелочные функции и функции обратного вызова

Стрелочные функции способны работать с рест-операторами, что очень удобно в колбэках, позволяя принимать неограниченное количество аргументов.

JS
Скопировать код
const arrowSum = (...values) => values.reduce((acc, val) => acc + val, 0);
console.log(arrowSum(1, 10, 20)); // Возвращает 31

Методы классов

Методы класса тоже могут обрабатывать несколько входящих аргументов, используя рест-операторы.

JS
Скопировать код
class Greeter {
  static greet(...names) {
    return 'Привет, ' + names.join(' и ') + '!';
  }
}

console.log(Greeter.greet('Алиса', 'Боб'));

Лучшие практики

Проверка типов

Рекомендуется всегда проверять типы входящих аргументов, особенно если ожидается массив.

JS
Скопировать код
function isArray(args) {
  return Array.isArray(args);
}

Принцип DRY (Don't Repeat Yourself)

JavaScript поддерживает принцип DRY, позволяя создать универсальную функцию для преобразования объекта arguments в массив.

JS
Скопировать код
function convertArgsToArray(args) {
  return Array.from(args);
}

Полезные материалы

  1. Объект arguments – JavaScript | MDN
  2. Оператор расширения (...) – JavaScript | MDN
  3. Как превратить объект "arguments" в массив в JavaScript? – Stack Overflow
  4. Остаточные параметры – JavaScript | MDN
  5. Function.prototype.apply() – JavaScript | MDN
  6. ES2018: свойства rest/spread
  7. Учебник | DigitalOcean