Eu gostaria de chamar uma função usando uma matriz como parâmetros:
const x = ['p0', 'p1', 'p2'];
call_me(x[0], x[1], x[2]); // I don't like it
function call_me (param0, param1, param2 ) {
// ...
}
Existe uma maneira melhor de passar o conteúdo do x
para call_me()
?
javascript
arrays
function
call
Robert
fonte
fonte
Por que você não passa a matriz inteira e a processa conforme necessário dentro da função?
fonte
call_me
função. Falta apenas um ponto e vírgula no final.Supondo que call_me seja uma função global, você não espera que isso seja definido.
fonte
No padrão ES6, há um novo operador de spread
...
que faz exatamente isso.É suportado por todos os principais navegadores, exceto o IE.
O operador de propagação pode fazer muitas outras coisas úteis, e a documentação vinculada faz um bom trabalho em mostrar isso.
fonte
Como @KaptajnKold respondeu
E você também não precisa definir todos os parâmetros para a função call_me. Você pode apenas usar
arguments
fonte
Observe isso
// ---------------------------
página html
pode chamar a função com qualquer Args
ou
fonte
Os argumentos da função também podem ser matrizes:
é claro que também se pode usar spread :
fonte
Ao usar o operador spread, devemos observar que deve ser o último ou o único parâmetro passado. Senão falhará.
Se você precisar passar uma matriz como argumento inicial, poderá:
fonte
você pode usar o operador spread de uma forma mais básica
no caso de funções que retornam matrizes, mas espera-se que sejam transmitidas como argumentos
Exemplo:
fonte
A resposta já foi dada, mas eu só quero dar meu pedaço de bolo. O que você deseja alcançar é chamado
method borrowing
no contexto de JS, quando pegamos um método de um objeto e o chamamos no contexto de outro objeto. É bastante comum usar métodos de matriz e aplicá-los a argumentos. Deixe-me lhe dar um exemplo.Portanto, temos a função de hash "super", que recebe dois números como argumento e retorna a string de hash "super segura":
Até aí tudo bem, mas temos pouco problema com a abordagem acima, ela é restrita, funciona apenas com dois números, que não é dinâmico, vamos fazê-la funcionar com qualquer número e, além disso, você não precisa passar uma matriz (você pode se você ainda insistir). Ok, chega de conversa, vamos lutar!
A solução natural seria usar o
arr.join
método:Oh cara. Infelizmente, isso não vai funcionar. Como estamos chamando hash (argumentos) e objeto de argumentos, é iterável e semelhante a um array, mas não um array real. E a abordagem abaixo?
O truque é chamado
method borrowing.
Nós emprestamos um
join
método de uma matriz regular[].join.
e usamos[].join.call
para executá-lo no contexto dearguments
.Por que isso funciona?
Isso ocorre porque o algoritmo interno do método nativo
arr.join(glue)
ocorre é muito simples.Retirado da especificação quase "como está":
Então, tecnicamente, é preciso isso e une esse [0], esse [1] ... etc juntos. É intencionalmente escrito de uma maneira que permite qualquer array como este (não é uma coincidência, muitos métodos seguem essa prática). É por isso que também funciona com
this=arguments.
fonte