Existe uma maneira de permitir vars "ilimitados" para uma função em JavaScript?
Exemplo:
load(var1, var2, var3, var4, var5, etc...)
load(var1)
Existe uma maneira de permitir vars "ilimitados" para uma função em JavaScript?
Exemplo:
load(var1, var2, var3, var4, var5, etc...)
load(var1)
Respostas:
Claro, basta usar o
arguments
objeto.fonte
arguments
é um objeto especial "Array-like", que significa que possui um comprimento, mas nenhuma outra função de matriz. Consulte developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/… para obter mais informações e esta resposta: stackoverflow.com/a/13145228/1766230length
propriedade. Isso inclui oarguments
objeto. Sabendo disso, e que o métodoconcat
retorna uma cópia do 'array' é chamado, podemos facilmente converter oarguments
objeto para uma matriz real, como este:var args = [].concat.call(arguments)
. Algumas pessoas preferem usarArray.prototype.concat.call
, mas eu gosto do[]
, são curtas e doces![...arguments].join()
Nos navegadores (mais) recentes, você pode aceitar um número variável de argumentos com esta sintaxe:
Aqui está um pequeno exemplo:
Documentação e mais exemplos aqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters
fonte
Outra opção é passar seus argumentos em um objeto de contexto.
e use assim
Isso tem a vantagem de você poder adicionar quantos argumentos nomeados desejar e a função pode usá-los (ou não) como achar melhor.
fonte
context
argumento com o código e passá-lo antes que ele seja usado.Concordo com a resposta de Ken como a mais dinâmica e gosto de dar um passo adiante. Se é uma função que você chama várias vezes com argumentos diferentes - eu uso o design de Ken, mas adiciono valores padrão:
Dessa forma, se você tiver muitos parâmetros, mas não necessariamente precisar defini-los com cada chamada para a função, poderá simplesmente especificar os não padrões. Para o método de extensão, você pode usar o método de extensão do jQuery (
$.extend()
), criar seu próprio ou usar o seguinte:Isso mesclará o objeto de contexto com os padrões e preencherá os valores indefinidos em seu objeto com os padrões.
fonte
_.defaults()
método de sublinhado é uma alternativa muito boa para mesclar argumentos especificados e padrão.Sim, assim:
fonte
É preferível usar a sintaxe do parâmetro rest como Ramast apontou.
Eu só quero adicionar uma propriedade legal do argumento ... args
fonte
Como já mencionado, você pode usar o
arguments
objeto para recuperar um número variável de parâmetros de função.Se você quiser chamar outra função com os mesmos argumentos, use
apply
. Você pode até adicionar ou remover argumentos convertendoarguments
em uma matriz. Por exemplo, esta função insere algum texto antes de efetuar o logon no console:fonte
Embora eu concorde geralmente que a abordagem de argumentos nomeados é útil e flexível (a menos que você se importe com a ordem, caso em que os argumentos são mais fáceis), tenho preocupações sobre o custo da abordagem de mbeasley (usando padrões e extensões). Essa é uma quantia extrema de custo para extrair valores padrão. Primeiro, os padrões são definidos dentro da função e, portanto, são preenchidos novamente em todas as chamadas. Segundo, você pode ler facilmente os valores nomeados e definir os padrões ao mesmo tempo usando ||. Não há necessidade de criar e mesclar outro novo objeto para obter essas informações.
Essa é aproximadamente a mesma quantidade de código (talvez um pouco mais), mas deve ser uma fração do custo de tempo de execução.
fonte
(parameter1=context.parameter1)===undefined && (parameter1=defaultValue1)
ou para menos volume de código, uma pequena função auxiliar como:function def(providedValue, default) {return providedValue !== undefined ? providedValue : defaultValue;} var parameter1 = def(context.parameter1, defaultValue1)
forneça padrões alternativos. No entanto, meu argumento ainda permanece: criar objetos extras para cada chamada de função e executar loops caros para definir alguns valores padrão são uma quantidade absurda de sobrecarga.Embora o @roufamatic tenha mostrado o uso da palavra-chave argumentos e o @Ken tenha mostrado um ótimo exemplo de um objeto para uso, não sinto realmente o que está acontecendo neste caso e posso confundir futuros leitores ou incutir uma má prática por não declarar explicitamente uma função / method destina-se a receber uma quantidade variável de argumentos / parâmetros.
Quando outro desenvolvedor está pesquisando seu código, é muito fácil assumir que essa função não aceita parâmetros. Especialmente se esse desenvolvedor não estiver a par da palavra-chave argumentos . Por isso, é uma boa idéia seguir uma orientação de estilo e ser consistente. Vou usar o Google para todos os exemplos.
Vamos declarar explicitamente que a mesma função possui parâmetros variáveis:
Parâmetro de objeto VS var_args
Pode haver momentos em que um objeto é necessário, pois é o único método de boas práticas aprovado e considerado de um mapa de dados. Matrizes associativas são desaprovadas e desencorajadas.
SIDENOTE: A palavra-chave argumentos na verdade retorna um objeto usando números como a chave. A herança prototípica também é a família de objetos. Consulte o final da resposta para obter o uso apropriado da matriz em JS
Nesse caso, também podemos declarar explicitamente isso. Nota: esta convenção de nomenclatura não é fornecida pelo Google, mas é um exemplo de declaração explícita do tipo de um parâmetro. Isso é importante se você deseja criar um padrão digitado mais estrito no seu código.
Qual escolher?
Isso depende das necessidades de sua função e programa. Se, por exemplo, você está simplesmente procurando retornar uma base de valores em um processo iterativo em todos os argumentos passados, certamente se aterá à palavra-chave argumentos . Se você precisar definir seus argumentos e mapear os dados, o método do objeto é o caminho a seguir. Vejamos dois exemplos e então terminamos!
Uso de argumentos
Uso de objeto
Acessando uma matriz em vez de um objeto ("... args" O parâmetro restante)
Como mencionado acima da resposta, a palavra-chave argumentos realmente retorna um objeto. Por esse motivo, qualquer método que você deseja usar para uma matriz precisará ser chamado. Um exemplo disso:
Para evitar isso, use o parâmetro rest:
fonte
Use o
arguments
objeto quando estiver dentro da função para ter acesso a todos os argumentos passados.fonte
Esteja ciente de que a passagem de um objeto com propriedades nomeadas, conforme sugerido por Ken, adiciona o custo de alocar e liberar o objeto temporário para cada chamada. Passar argumentos normais por valor ou referência geralmente será o mais eficiente. Para muitas aplicações, o desempenho não é crítico, mas para algumas pode ser.
fonte