Можно ли отправить переменное число аргументов в функцию JavaScript из массива?
var arr = ['a','b','c']
var func = function()
{
// debug
alert(arguments.length);
//
for(arg in arguments)
alert(arg);
}
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'
Я недавно написал много Python, и это замечательный способ иметь возможность принимать varargs и отправлять их. например
def func(*args):
print len(args)
for i in args:
print i
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(*arr) // prints 4 which is what I want, then 'a','b','c','d'
Можно ли в JavaScript отправить массив для обработки в качестве аргумента массива?
javascript
variadic-functions
Огненная ворона
источник
источник
for - in
цикл сarguments
объектом -length
вместо него следует использовать «нормальный» цикл, повторяющий свойствоОтветы:
Обновление : начиная с ES6, вы можете просто использовать синтаксис распространения при вызове функции:
Поскольку ES6 также, если вы собираетесь обрабатывать свои аргументы как массив, вы также можете использовать синтаксис распространения в списке параметров, например:
И вы можете комбинировать его с обычными параметрами, например, если вы хотите получить первые два аргумента отдельно, а остальные как массив:
И, возможно, вам будет полезно узнать, сколько аргументов ожидает функция:
Но в любом случае вы можете передать произвольное количество аргументов ...
Синтаксис распространения короче и «слаще», чем,
apply
и если вам не нужно устанавливатьthis
значение в вызове функции, это путь.Вот пример применения , который был первым способом сделать это:
В настоящее время я рекомендую использовать
apply
только, если вам нужно передать произвольное количество аргументов из массива и установитьthis
значение.apply
принимаетthis
значение в качестве первых аргументов, которые будут использоваться при вызове функции; если мы используемnull
в нестрогом коде,this
ключевое слово будет ссылаться на глобальный объект (окно) внутриfunc
, в строгом режиме, когда явно используется «использовать строгий». 'или в модулях ES,null
будет использоваться.Также обратите внимание, что
arguments
объект на самом деле не является массивом, вы можете преобразовать его:И в ES6:
Но вы редко используете
arguments
объект прямо сейчас, благодаря синтаксису распространения.источник
Array.prototype.slice.call(arguments);
предотвращает JS-оптимизацию браузера, такую как V8. Подробности здесьarguments
амортизация планируется в пользу оператора спреда . У меня нет источника для этого, но я где-то слышал. 2. MDN государства , что использованиеslice
наarguments
объект предотвращает оптимизации в системах , как V8. Они предлагают использовать «презираемый конструктор массива»Array.from(arguments)
, или[...arguments]
. Вы хотели бы обновить свой ответ для ES2015?На самом деле вы можете передать столько значений, сколько захотите, в любую функцию JavaScript. Явно названные параметры получат первые несколько значений, но ВСЕ параметры будут сохранены в массиве arguments.
Чтобы передать массив arguments в «распакованном» виде, вы можете использовать apply, например так (см. Функциональный Javascript ):
источник
Операторы сплат и распространение являются частью ES6, планируемой следующей версии Javascript. Пока их поддерживает только Firefox. Этот код работает в FF16 +:
Обратите внимание на синтаксис awkard для распространения. Обычный синтаксис
sprintf('The %s %s fox jumps over the %s dog.', ...arr);
пока не поддерживается . Вы можете найти таблицу совместимости ES6 здесь .Обратите внимание также на использование
for...of
еще одного дополнения ES6. Использованиеfor...in
для массивов - плохая идея .источник
apply
Функция принимает два аргумента; объектthis
будет связан с аргументами, представленными в виде массива.источник
Начиная с ES2015, существует два метода.
arguments
объектаЭтот объект встроен в функции и, соответственно, ссылается на аргументы функции. Технически, однако, это не массив, поэтому типичные операции над массивами не будут работать с ним. Предлагаемый метод заключается в использовании
Array.from
или оператора распространения для создания массива из него.Я видел другие ответы, упоминающие использование
slice
. Не делай этого. Это предотвращает оптимизацию (источник: MDN ).Тем не менее, я бы сказал, что
arguments
это проблематично, поскольку скрывает то, что функция принимает в качестве входных данных.arguments
Функция , как правило , записывается следующим образом:Иногда заголовок функции пишется следующим образом для документирования аргументов в стиле C:
Но это редко.
Что касается того, почему это проблематично, возьмем C, например. C обратно совместим с древним пре-ANSI диалектом языка, известного как K & R C. K & R C позволяет прототипам функций иметь пустой список аргументов.
ANSI C предоставляет возможность для
varargs
(...
) иvoid
для указания пустого списка аргументов.Многие люди непреднамеренно объявляют функции с
unspecified
аргументами list (int myfunction();
), когда ожидают, что функция примет нулевые аргументы. Технически это ошибка, потому что функция будет принимать аргументы. Любое их количество.Правильная
varargs
функция в C принимает форму:И в JavaScript действительно есть нечто похожее на это.
Spread Operator / Rest Parameter
Я уже показал вам оператор спреда.
Он довольно универсален и может также использоваться в списке аргументов функции («параметры покоя»), чтобы задавать переменные в хорошо документированном виде:
Или как лямбда-выражение:
Я предпочитаю спред оператора. Это чисто и самодокументировано.
источник
Это называется
splat
оператором. Вы можете сделать это в JavaScript, используяapply
:источник
С ES6 вы можете использовать остальные параметры для
varagrs
. Это берет список аргументов и преобразует его в массив.источник
Это пример программы для вычисления суммы целых чисел для переменных аргументов и массива на целых числах. Надеюсь это поможет.
источник
var
объявляетfunction scope
переменную. Новыеlet
иconst
ключевые слова (ES 2015) объявляютblock scope
переменные. До ES 2015, однако, переменные должны были все же быть выведены на вершину функции на практике. 2. Вашей функции пауза , когда данные 1 целочисленного значения из - за свое ошибочное принятие массива в качестве аргумента (вопрос спрашивает о переменной длине; не принимать массивы в качестве аргументов):CalculateSum(6) -> 0
. (продолжение в следующем посте)alert
. На самом деле, просто не используйтеalert/prompt/confirm
, точка. Используйтеconsole.log
вместо этого при отладке. 4. Функция должна иметьreturn
значение, а неalert
его. 5. избегать,PascalCase
если это не относится к «типу» данных. Т.е. класс. ИспользуйтеcamelCase
илиunder_score
вместо. 4. Мне не нравится, как вы объявляете свои функции.var f = function(){ ... }
подразумевает, что вы хотите, чтобы это изменилось в какой-то момент, что, вероятно, не ваше намерение.function name(){ ... }
Вместо этого используйте обычный синтаксис.источник
Для тех, кто был перенаправлен сюда с передачи переменного числа аргументов из одной функции в другую (что не должно быть помечено как дубликат этого вопроса):
Если вы пытаетесь передать переменное число аргументов из одной функции в другую, начиная с JavaScript 1.8.5, вы можете просто вызвать
apply()
вторую функцию и передатьarguments
параметр:Примечание . Первый аргумент - это используемый
this
параметр. Передачаnull
вызовет функцию из глобального контекста, то есть как глобальную функцию вместо метода какого-либо объекта.В соответствии с этим документом спецификация ECMAScript 5 переопределила
apply()
метод для принятия любого «универсального объекта, подобного массиву», вместо строго массива. Таким образом, вы можете напрямую передатьarguments
список во вторую функцию.Протестировано в Chrome 28.0, Safari 6.0.5 и IE 10. Попробуйте это с этим JSFiddle .
источник
Да, вы можете передать переменную нет. аргументов для функции. Вы можете использовать
apply
для достижения этой цели.Например:
источник
Вы хотите, чтобы ваша функция реагировала на аргументы массива или переменные? Если последнее, попробуйте:
Но если вы хотите обработать аргумент массива
источник