Me gustaría llamar a una función usando una 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 ) {
// ...
}
¿Hay una mejor manera de pasar el contenido de x
into call_me()
?
javascript
arrays
function
call
Robert
fuente
fuente
¿Por qué no pasa toda la matriz y la procesa según sea necesario dentro de la función?
fuente
call_me
función. Simplemente le falta un punto y coma al final.Suponiendo que call_me es una función global, por lo que no espera que se establezca.
fuente
En el estándar ES6 hay un nuevo operador de propagación
...
que hace exactamente eso.Es compatible con todos los principales navegadores, excepto IE.
El operador de propagación puede hacer muchas otras cosas útiles, y la documentación vinculada hace un muy buen trabajo al mostrar eso.
fuente
Como @KaptajnKold había respondido
Y tampoco necesita definir todos los parámetros para la función call_me. Puedes usar
arguments
fuente
Nota esto
// ---------------------------
página html
puede llamar a la función con cualquier Args
o
fuente
Los argumentos de la función también pueden ser matrices:
por supuesto, también se puede usar propagación :
fuente
Al usar el operador spread debemos tener en cuenta que debe ser el último o único parámetro pasado. De lo contrario, fallará.
Si necesita pasar una matriz como argumento inicial, puede hacerlo:
fuente
puedes usar el operador spread en una forma más básica
en el caso de funciones que devuelven matrices pero se espera que pasen como argumentos
Ejemplo:
fuente
La respuesta ya estaba dada, pero solo quiero dar mi pedazo de pastel. Lo que quieres lograr se llama
method borrowing
en el contexto de JS, que cuando tomamos un método de un objeto y lo llamamos en el contexto de otro objeto. Es bastante común tomar métodos de matriz y aplicarlos a argumentos. Dejame darte un ejemplo.Por lo tanto, tenemos la función de hash "super" que toma dos números como argumento y devuelve una cadena hash "super safe":
Hasta ahora todo bien, pero tenemos pocos problemas con el enfoque anterior, es limitado, solo funciona con dos números, eso no es dinámico, hagamos que funcione con cualquier número y además no tiene que pasar una matriz (puede si aún insistes) Ok, basta de hablar, ¡peleemos!
La solución natural sería utilizar el
arr.join
método:Oh hombre. Desafortunadamente, eso no funcionará. Debido a que estamos llamando a hash (argumentos) y argumentos, el objeto es iterable y similar a una matriz, pero no es una matriz real. ¿Qué tal el enfoque a continuación?
El truco se llama
method borrowing.
Tomamos prestado un
join
método de una matriz regular[].join.
y lo usamos[].join.call
para ejecutarlo en el contexto dearguments
.Por que funciona
Eso es porque el algoritmo interno del método nativo
arr.join(glue)
es muy simple.Tomado de la especificación casi "tal cual":
Entonces, técnicamente toma esto y une esto [0], esto [1] ... etc. Está escrito intencionalmente de una manera que permite cualquier matriz como esta (no es una coincidencia, muchos métodos siguen esta práctica). Por eso también funciona con
this=arguments.
fuente