Хотя @roufamatic действительно показывал использование ключевого слова arguments и @Ken показывал отличный пример объекта для использования, я не чувствую истинного понимания того, что происходит в этом случае, и может запутать будущих читателей или привить плохую практику, поскольку это явно не указание функции / метода предназначено для получения переменного количества аргументов / параметров.
function varyArg () {
return arguments[0] + arguments[1];
}
Когда другой разработчик просматривает ваш код, очень легко предположить, что эта функция не принимает параметры. Особенно, если этот разработчик не знаком с ключевым словом arguments . Из-за этого хорошей идеей будет следовать руководству по стилю и быть последовательным. Я буду использовать Google для всех примеров.
Давайте прямо заявим, что та же функция имеет переменные параметры:
function varyArg (var_args) {
return arguments[0] + arguments[1];
}
Параметр объекта VS var_args
Могут быть случаи, когда объект необходим, поскольку это единственный одобренный и рассмотренный наилучший метод карты данных. Ассоциативные массивы осуждаются и не поощряются.
SIDENOTE: Ключевое слово arguments на самом деле возвращает объект, используя числа в качестве ключа. Прототип наследования также является объектным семейством. Смотрите конец ответа для правильного использования массива в JS
В этом случае мы также можем это явно указать. Примечание: это соглашение об именах не предоставляется Google, но является примером явного объявления типа параметра. Это важно, если вы хотите создать более строгий типизированный шаблон в вашем коде.
function varyArg (args_obj) {
return args_obj.name+" "+args_obj.weight;
}
varyArg({name: "Brian", weight: 150});
Какой из них выбрать?
Это зависит от потребностей вашей функции и программы. Например, если вы просто хотите вернуть базу значений в итеративном процессе по всем переданным аргументам, то наверняка придерживайтесь ключевого слова arguments . Если вам нужно определение ваших аргументов и отображение данных, тогда метод объекта - путь. Давайте посмотрим на два примера, и тогда мы закончим!
Использование аргументов
function sumOfAll (var_args) {
return arguments.reduce(function(a, b) {
return a + b;
}, 0);
}
sumOfAll(1,2,3); // returns 6
Использование объекта
function myObjArgs(args_obj) {
// MAKE SURE ARGUMENT IS AN OBJECT OR ELSE RETURN
if (typeof args_obj !== "object") {
return "Arguments passed must be in object form!";
}
return "Hello "+args_obj.name+" I see you're "+args_obj.age+" years old.";
}
myObjArgs({name: "Brian", age: 31}); // returns 'Hello Brian I see you're 31 years old
Доступ к массиву вместо объекта ("... args" Параметр rest)
Как уже упоминалось в верхней части ответа, ключевое слово arguments фактически возвращает объект. Из-за этого должен быть вызван любой метод, который вы хотите использовать для массива. Пример этого:
Array.prototype.map.call(arguments, function (val, idx, arr) {});
Чтобы избежать этого, используйте параметр rest:
function varyArgArr (...var_args) {
return var_args.sort();
}
varyArgArr(5,1,3); // returns 1, 3, 5