¿Es posible enviar un número variable de argumentos a una función de JavaScript, desde una 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'
Recientemente he escrito mucho Python y es un patrón maravilloso poder aceptar varargs y enviarlos. p.ej
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'
¿Es posible en JavaScript enviar una matriz para ser tratada como la matriz de argumentos?
javascript
variadic-functions
Cuervo de fuego
fuente
fuente
for - in
bucle con elarguments
objeto: en su lugarlength
, debe usarse un 'normal' para iterar el bucle sobre la propiedadRespuestas:
Actualización : desde ES6, simplemente puede usar la sintaxis de propagación al llamar a la función:
Dado que ES6 también si espera tratar sus argumentos como una matriz, también puede usar la sintaxis extendida en la lista de parámetros, por ejemplo:
Y puede combinarlo con parámetros normales, por ejemplo, si desea recibir los dos primeros argumentos por separado y el resto como una matriz:
Y quizás sea útil para usted, que puede saber cuántos argumentos espera una función:
Pero de todos modos puedes pasar una cantidad arbitraria de argumentos ...
La sintaxis de propagación es más corta y "más dulce" que,
apply
y si no necesita establecer elthis
valor en la llamada a la función, este es el camino a seguir.Aquí hay un ejemplo de aplicación , que era la forma anterior de hacerlo:
Hoy en día solo recomiendo usar
apply
solo si necesita pasar un número arbitrario de argumentos de una matriz y establecer elthis
valor.apply
toma es elthis
valor como los primeros argumentos, que se utilizarán en la invocación de la función, si usamosnull
en código no estricto, lathis
palabra clave se referirá al objeto Global (ventana) dentrofunc
, en modo estricto, cuando se usa explícitamente 'use estricto 'o en módulos ES,null
se utilizarán.También tenga en cuenta que el
arguments
objeto no es realmente una matriz, puede convertirlo de la siguiente manera:Y en ES6:
Pero rara vez se usa el
arguments
objeto directamente hoy en día gracias a la sintaxis de propagación.fuente
Array.prototype.slice.call(arguments);
evita las optimizaciones JS del navegador como V8. Detalles aquíarguments
está planeado ser desaprobado a favor del operador de propagación . No tengo una fuente para esto, pero lo escuché en alguna parte. 2. MDN afirma que el usoslice
en elarguments
objeto evita optimizaciones en motores como V8. Sugieren usar el "despreciado constructor de matrices"Array.from(arguments)
, o[...arguments]
. ¿Le gustaría actualizar su respuesta para ES2015?En realidad, puede pasar tantos valores como desee a cualquier función de JavaScript. Los parámetros nombrados explícitamente obtendrán los primeros valores, pero TODOS los parámetros se almacenarán en la matriz de argumentos.
Para pasar la matriz de argumentos en forma "desempaquetada", puede usar apply, así (cf. Javascript funcional ):
fuente
Los operadores splat y spread son parte de ES6, la próxima versión planificada de Javascript. Hasta ahora, solo Firefox los admite. Este código funciona en FF16 +:
Tenga en cuenta la sintaxis awkard para propagación. La sintaxis habitual de
sprintf('The %s %s fox jumps over the %s dog.', ...arr);
está todavía no está soportado . Puede encontrar una tabla de compatibilidad ES6 aquí .Tenga en cuenta también el uso de
for...of
, otra adición de ES6. Usarfor...in
para matrices es una mala idea .fuente
La
apply
función toma dos argumentos; el objetothis
se vinculará y los argumentos se representarán con una matriz.fuente
Hay dos métodos a partir de ES2015.
El
arguments
objetoEste objeto está integrado en funciones, y se refiere, apropiadamente, a los argumentos de una función. Sin embargo, técnicamente no es una matriz, por lo que las operaciones de matriz típicas no funcionarán en ella. El método sugerido es usar
Array.from
el operador de propagación para crear una matriz a partir de él.He visto otras respuestas mencionar el uso
slice
. No hagas eso. Impide optimizaciones (fuente: MDN ).Sin embargo, diría que
arguments
es problemático porque oculta lo que una función acepta como entrada. Unaarguments
función típicamente se escribe así:A veces, el encabezado de la función se escribe de la siguiente manera para documentar los argumentos en forma de C:
Pero eso es raro.
En cuanto a por qué es problemático, tome C, por ejemplo. C es retrocompatible con un antiguo dialecto pre-ANSI del lenguaje conocido como K&R C. K&R C permite que los prototipos de funciones tengan una lista de argumentos vacía.
ANSI C proporciona una función para
varargs
(...
) yvoid
para especificar una lista de argumentos vacía.Muchas personas declaran inadvertidamente funciones con una
unspecified
lista de argumentos (int myfunction();
), cuando esperan que la función tome cero argumentos. Esto es técnicamente un error debido a que la función de la voluntad aceptar los argumentos. Cualquier número de ellos.Una
varargs
función adecuada en C toma la forma:Y JavaScript en realidad tiene algo similar a esto.
Operador extendido / Parámetros de descanso
Ya te he mostrado el operador de propagación, en realidad.
Es bastante versátil y también se puede usar en la lista de argumentos de una función ("parámetros de reposo") para especificar varargs de una manera bien documentada:
O como una expresión lambda:
Prefiero mucho el operador de propagación. Es limpio y autodocumentado.
fuente
Se llama el
splat
operador. Puedes hacerlo en JavaScript usandoapply
:fuente
Con ES6 puede usar parámetros de reposo para
varagrs
. Esto toma la lista de argumentos y la convierte en una matriz.fuente
Este es un programa de muestra para calcular la suma de enteros para argumentos variables y matriz en enteros. Espero que esto ayude.
fuente
var
declara unafunction scope
variable. El nuevolet
y lasconst
palabras clave (ES 2015) declaranblock scope
variables. Sin embargo, antes de ES 2015, las variables deberían haberse elevado a la parte superior de la función como una práctica. 2. sus funciones se rompe cuando se administran 1 valor entero debido a la aceptación errónea de una matriz como un argumento (la pregunta se refiere a varargs; no aceptar matrices como argumentos):CalculateSum(6) -> 0
. (continúa en el próximo post)alert
. En realidad, no lo usesalert/prompt/confirm
, punto. Use en suconsole.log
lugar al depurar. 4. La función debe serreturn
un valor, no un valoralert
. 5. evitar aPascalCase
menos que se refiera a un "tipo" de datos. Es decir, una clase. UsocamelCase
o en suunder_score
lugar. 4. No me gusta la forma en que declaras tus funciones.var f = function(){ ... }
implica que quieres que cambie en algún momento, lo que probablemente no sea tu intención. Utilice lafunction name(){ ... }
sintaxis convencional en su lugar.fuente
Para aquellos que fueron redirigidos aquí al pasar el número variable de argumentos de una función a otra (que no debe marcarse como un duplicado de esta pregunta):
Si está tratando de pasar un número variable de argumentos de una función a otra, desde JavaScript 1.8.5 simplemente puede llamar
apply()
a la segunda función y pasar elarguments
parámetro:Nota: El primer argumento es el
this
parámetro a usar. Pasarnull
llamará a la función desde el contexto global, es decir, como una función global en lugar del método de algún objeto.Según este documento , la especificación ECMAScript 5 redefinió el
apply()
método para tomar cualquier "objeto genérico similar a una matriz", en lugar de estrictamente una matriz. Por lo tanto, puede pasar directamente laarguments
lista a la segunda función.Probado en Chrome 28.0, Safari 6.0.5 e IE 10. Pruébelo con este JSFiddle .
fuente
Sí, puede pasar la variable no. de argumentos a una función. Puedes usar
apply
para lograr esto.P.ej:
fuente
¿Desea que su función reaccione a un argumento de matriz o argumentos variables? Si es lo último, intente:
Pero si desea manejar un argumento de matriz
fuente