6

JavaScript: Переменное количество аргументов для функции

4

Вопрос: Есть ли способ разрешить "неограниченное" количество аргументов для функции в JavaScript?

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

load(var1, var2, var3, var4, var5, и т.д.)
load(var1)

Как я могу достичь этого в JavaScript? Существуют ли какие-либо специальные методы или синтаксис для обработки неограниченного количества переменных в аргументах функции?

5 ответ(ов)

9

Конечно, просто используйте объект arguments.

function foo() {
  for (var i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }
}

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

3

В последних браузерах вы можете принимать переменное количество аргументов с помощью следующего синтаксиса:

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.

1

Другой вариант - передать ваши аргументы в объекте контекста.

function load(context)
{
    // делайте с context.name, context.address и т.д. всё, что нужно
}

Используйте его следующим образом:

load({name:'Ken', address:'secret', unused:true})

Преимущество этого подхода в том, что вы можете добавлять столько именованных аргументов, сколько захотите, а функция сможет использовать их (или игнорировать) по своему усмотрению.

0

Я согласен с ответом Кена, так как он является наиболее динамичным, и хотел бы немного уточнить. Если вы вызываете функцию несколько раз с различными аргументами, я использую дизайн Кена, но добавляю значения по умолчанию:

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 и заполняет любые неустановленные значения в вашем объекте значениями по умолчанию.

0

Предпочтительно использовать синтаксис параметров rest, как указал Ramast.

function (a, b, ...args) {}

Я хочу добавить несколько интересных свойств аргумента ...args:

  1. Это массив, а не объект, как arguments. Это позволяет применять функции, такие как map или sort, напрямую.
  2. Этот параметр не включает все аргументы, а только те, которые переданы после него. Например, в случае function (a, b, ...args), массив args будет содержать аргументы с 3-го до arguments.length.
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь