É possível enviar um número variável de argumentos para uma função JavaScript, a partir de uma matriz?
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'
Recentemente, escrevi muito Python e é um padrão maravilhoso poder aceitar varargs e enviá-los. por exemplo
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'
É possível no JavaScript enviar uma matriz para ser tratada como a matriz de argumentos?
javascript
variadic-functions
Corvo de fogo
fonte
fonte
for - in
laço com oarguments
objeto - um 'normal' loop iteração sobre alength
propriedade deve ser usada em vezRespostas:
Atualização : Desde o ES6, você pode simplesmente usar a sintaxe de propagação ao chamar a função:
Como o ES6 também se você espera tratar seus argumentos como uma matriz, também pode usar a sintaxe de propagação na lista de parâmetros, por exemplo:
E você pode combiná-lo com parâmetros normais, por exemplo, se você deseja receber os dois primeiros argumentos separadamente e o restante como uma matriz:
E talvez seja útil para você, que você possa saber quantos argumentos uma função espera:
Mas de qualquer maneira você pode passar um número arbitrário de argumentos ...
A sintaxe de propagação é mais curta e "mais doce" do que
apply
e se você não precisar definir othis
valor na chamada de função, este é o caminho a percorrer.Aqui está um exemplo de aplicação , que era a primeira maneira de fazer isso:
Atualmente, eu recomendo o uso
apply
apenas se você precisar passar um número arbitrário de argumentos de uma matriz e definir othis
valor.apply
takes é othis
valor dos primeiros argumentos, que serão usados na invocação da função. Se usarmosnull
em código não estrito, athis
palavra - chave se referirá ao objeto Global (janela) dentrofunc
, em modo estrito, ao usar explicitamente 'use strict 'ou nos módulos ES,null
será usado.Observe também que o
arguments
objeto não é realmente uma matriz, você pode convertê-lo por:E no ES6:
Mas você raramente usa o
arguments
objeto diretamente hoje em dia, graças à sintaxe de propagação.fonte
Array.prototype.slice.call(arguments);
impede otimizações de JS do navegador como a V8. Detalhes aquiarguments
está planejado para ser preterido em favor do operador de spread . Não tenho uma fonte para isso, mas ouvi em algum lugar. 2. O MDN afirma que o usoslice
noarguments
objeto impede otimizações em mecanismos como o V8. Eles sugerem o uso do "construtor Array desprezado"Array.from(arguments)
, ou[...arguments]
. Gostaria de atualizar sua resposta para o ES2015?Você pode realmente passar quantos valores desejar para qualquer função javascript. Os parâmetros explicitamente nomeados obterão os primeiros valores, mas TODOS os parâmetros serão armazenados na matriz de argumentos.
Para passar a matriz de argumentos no formato "descompactado", você pode usar o apply, assim (cf Javascript funcional ):
fonte
Os operadores splat e spread fazem parte do ES6, a próxima versão planejada do Javascript. Até agora, apenas o Firefox os suporta. Este código funciona no FF16 +:
Observe a sintaxe do awkard para a propagação. A sintaxe usual de
sprintf('The %s %s fox jumps over the %s dog.', ...arr);
se ainda não é suportado . Você pode encontrar uma tabela de compatibilidade ES6 aqui .Observe também o uso de
for...of
outra adição ao ES6. Usarfor...in
para matrizes é uma má ideia .fonte
A
apply
função usa dois argumentos; o objetothis
será vinculado e os argumentos representados com uma matriz.fonte
Existem dois métodos a partir do ES2015.
O
arguments
ObjetoEste objeto é incorporado às funções e refere-se, adequadamente, aos argumentos de uma função. Tecnicamente, não é um array, portanto, as operações típicas do array não funcionarão nele. O método sugerido é usar
Array.from
ou o operador spread para criar uma matriz a partir dele.Já vi outras respostas mencionadas usando
slice
. Não faça isso. Impede otimizações (fonte: MDN ).No entanto, eu argumentaria que isso
arguments
é problemático porque oculta o que uma função aceita como entrada. Umaarguments
função normalmente é escrita assim:Às vezes, o cabeçalho da função é escrito da seguinte maneira para documentar os argumentos do modo C:
Mas isso é raro.
Por que é problemático, considere C, por exemplo. C é retrocompatível com um dialeto antigo pré-ANSI do idioma conhecido como K&R C. O K&R C permite que os protótipos de função tenham uma lista de argumentos vazia.
O ANSI C fornece um recurso para
varargs
(...
) evoid
para especificar uma lista de argumentos vazia.Muitas pessoas inadvertidamente declaram funções com uma
unspecified
lista de argumentos (int myfunction();
), quando esperam que a função receba zero argumentos. Tecnicamente, isso é um bug, porque a função será aceitar argumentos. Qualquer número deles.Uma
varargs
função adequada em C assume a forma:E o JavaScript realmente tem algo parecido com isso.
Operador de propagação / parâmetros de repouso
Eu já mostrei o operador spread, na verdade.
É bastante versátil e também pode ser usado na lista de argumentos de uma função ("rest parameters") para especificar varargs de uma maneira bem documentada:
Ou como uma expressão lambda:
Eu prefiro muito o operador spread. É limpo e auto-documentado.
fonte
Chama-se
splat
operador. Você pode fazer isso em JavaScript usandoapply
:fonte
Com o ES6, você pode usar os parâmetros de descanso para
varagrs
. Isso pega a lista de argumentos e a converte em uma matriz.fonte
Este é um programa de amostra para calcular a soma de números inteiros para argumentos variáveis e matriz em números inteiros. Espero que isto ajude.
fonte
var
declara umafunction scope
variável. O novolet
e asconst
palavras - chave (ES 2015) declaramblock scope
variáveis. Antes do ES 2015, no entanto, as variáveis ainda deveriam ter sido içadas para o topo da função como uma questão de prática. 2. seus intervalos de função quando dado um valor inteiro por causa da sua aceitação errónea de uma matriz como um argumento (A pergunta sobre varargs; não aceitar matrizes como argumentos):CalculateSum(6) -> 0
. (continuação no próximo post)alert
. Na verdade, apenas não usealert/prompt/confirm
, ponto final. Use emconsole.log
vez disso ao depurar. 4. A função deve serreturn
um valor, não um valoralert
. 5. evite, aPascalCase
menos que se refira a um "tipo" de dados. Ou seja, uma aula. UsecamelCase
ou emunder_score
vez disso. 4. Não gosto da maneira como você declara suas funções.var f = function(){ ... }
implica que você deseja que ele mude em algum momento, o que provavelmente não é sua intenção. Use afunction name(){ ... }
sintaxe convencional .fonte
Para aqueles que foram redirecionados aqui de Passando número variável de argumentos de uma função para outra (que não deve ser marcada como uma duplicata desta pergunta):
Se você está tentando passar um número variável de argumentos de uma função para outra, desde o JavaScript 1.8.5, você pode simplesmente chamar
apply()
a segunda função e passar oarguments
parâmetro:Nota: O primeiro argumento é o
this
parâmetro a ser usado. A passagemnull
chamará a função do contexto global, ou seja, como uma função global em vez do método de algum objeto.De acordo com este documento , a especificação ECMAScript 5 redefiniu o
apply()
método para pegar qualquer "objeto genérico de matriz", em vez de estritamente uma matriz. Assim, você pode passar diretamente aarguments
lista para a segunda função.Testado no Chrome 28.0, Safari 6.0.5 e IE 10. Experimente com este JSFiddle .
fonte
Sim, você pode passar a variável no. de argumentos para uma função. Você pode usar
apply
para conseguir isso.Por exemplo:
fonte
Deseja que sua função reaja a um argumento de matriz ou argumentos de variável? Nesse último caso, tente:
Mas se você deseja lidar com um argumento de matriz
fonte