JavaScript: Переменное количество аргументов для функции
Вопрос: Есть ли способ разрешить "неограниченное" количество аргументов для функции в JavaScript?
Описание: Я пытаюсь создать функцию, которая могла бы принимать произвольное количество аргументов. Например, мне нужно реализовать что-то вроде этого:
load(var1, var2, var3, var4, var5, и т.д.)
load(var1)
Как я могу достичь этого в JavaScript? Существуют ли какие-либо специальные методы или синтаксис для обработки неограниченного количества переменных в аргументах функции?
5 ответ(ов)
Конечно, просто используйте объект arguments
.
function foo() {
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
В этом примере функция foo
принимает неограниченное количество аргументов, и с помощью объекта arguments
, который доступен внутри функции, вы можете получить доступ ко всем переданным значениям. Обратите внимание, что arguments
является массивоподобным объектом, поэтому можно использовать его свойство length
для определения количества переданных аргументов и цикл for
для их перебора.
В последних браузерах вы можете принимать переменное количество аргументов с помощью следующего синтаксиса:
function my_log(...args) {
// args — это массив
console.log(args);
// Вы можете передавать этот массив как параметры другой функции
console.log(...args);
}
Вот небольшой пример:
function foo(x, ...args) {
console.log(x, args, ...args, arguments);
}
foo('a', 'b', 'c', z='d')
Вывод будет следующим:
a
Array(3) [ "b", "c", "d" ]
b c d
Arguments
0: "a"
1: "b"
2: "c"
3: "d"
length: 4
Документацию и больше примеров можно найти здесь: MDN Web Docs - rest_parameters.
Другой вариант - передать ваши аргументы в объекте контекста.
function load(context)
{
// делайте с context.name, context.address и т.д. всё, что нужно
}
Используйте его следующим образом:
load({name:'Ken', address:'secret', unused:true})
Преимущество этого подхода в том, что вы можете добавлять столько именованных аргументов, сколько захотите, а функция сможет использовать их (или игнорировать) по своему усмотрению.
Я согласен с ответом Кена, так как он является наиболее динамичным, и хотел бы немного уточнить. Если вы вызываете функцию несколько раз с различными аргументами, я использую дизайн Кена, но добавляю значения по умолчанию:
function load(context) {
var defaults = {
parameter1: defaultValue1,
parameter2: defaultValue2,
...
};
var context = extend(defaults, context);
// выполняем необходимые действия
}
Таким образом, если у вас много параметров, но не обязательно устанавливать их каждый раз при вызове функции, вы можете просто указать те параметры, которые отличаются от значений по умолчанию. Для метода extend
вы можете воспользоваться методом jQuery $.extend()
, создать свой собственный или использовать следующий код:
function extend() {
for (var i = 1; i < arguments.length; i++)
for (var key in arguments[i])
if (arguments[i].hasOwnProperty(key))
arguments[0][key] = arguments[i][key];
return arguments[0];
}
Этот код объединяет объект context
с объектом defaults
и заполняет любые неустановленные значения в вашем объекте значениями по умолчанию.
Предпочтительно использовать синтаксис параметров rest, как указал Ramast.
function (a, b, ...args) {}
Я хочу добавить несколько интересных свойств аргумента ...args
:
- Это массив, а не объект, как
arguments
. Это позволяет применять функции, такие какmap
илиsort
, напрямую. - Этот параметр не включает все аргументы, а только те, которые переданы после него. Например, в случае
function (a, b, ...args)
, массивargs
будет содержать аргументы с 3-го доarguments.length
.
Установка значения по умолчанию для параметра функции в JavaScript
Сравнение: var functionName = function() {} против function functionName() {}
В чем разница между call и apply?
Передача параметров в функцию Bash
JavaScript: Знак плюс перед функциональным выражением