Javascript: "Infinito" parámetros para la función?
javascript url parameters (3)
La forma moderna de hacerlo es utilizando los parámetros de descanso :
function printArguments(...args) {
args.forEach((arg, index) => {
console.log(`Argument ${index}:`, arg);
});
}
printArguments(''hello'', true, new Date());
Al usar la sintaxis de ...args
, todos los parámetros se guardan en una matriz llamada args
.
A excepción de Internet Explorer, todos los navegadores ya incluyen esta función en su versión más reciente.
Fiddle: https://jsfiddle.net/Lbf0stst/
En Chrome, cuando console.log
en el siguiente:
console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter");
... lo imprime correctamente, sin errores ni advertencias. Agregué más parámetros, pero todavía se imprime correctamente.
console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter");
¿Cómo puedo tener una función de parámetro "infinito" como esa?
Las funciones pueden acceder a un objeto similar a una matriz llamado arguments
que contiene todos los argumentos que recibieron
function print_my_arguments(/**/){
var args = arguments;
for(var i=0; i<args.length; i++){
console.log(args[i]);
}
};
Y puede hacer la conversión opuesta (llamar a una función dada una lista de argumentos) con el método de aplicación:
// These are equivalent:
print_my_arguments(1,2,3);
print_my_arguments.apply(null, [1,2,3]);
// The first parameter to `apply` is the `this`.
// It is used when the function is a method.
foo.bar(1,2,3);
var f = foo.bar; f.apply(foo, [1,2,3]);
Algunos puntos importantes a tener en cuenta:
arguments
no es una matriz real y no tiene ninguno de los métodos de matriz habituales (división, unión, etc.). Puedes convertirlo en una matriz con la siguiente línea:var args = Array.prototype.slice.call(arguments);
La división también es útil si desea que su matriz solo contenga los argumentos sin nombre que se recibieron:
function foo(first_arg, second_arg /**/){ var variadic_args = Array.prototype.slice.call(arguments, 2); }
No todos los navegadores pueden manejar un número arbitrariamente grande de parámetros de función. La última vez que probé esto, en Chrome e IE hubo un después de unos 200.000 argumentos. Si su función puede recibir un número arbitrariamente grande de argumentos, considere empaquetar todos esos argumentos en una matriz regular.
Esos
/**/
comentarios que aparecen en las listas de argumentos para mis ejemplos no son obligatorios. Son solo una codificación de una convención que utilizo para marcar mis funciones variables y diferenciarlas de las funciones regulares.// A quick glance would suggest that this function receives no // parameters but actually it is a variadic function that gets // its parameters via the `arguments` object. function foo(){ console.log(arguments.length); }
Puede usar la matriz de argumentos: jsfiddle.net/kUnJ2/
function foo() {
for (var i = 0; i < arguments.length; i++) {
document.body.innerHTML += arguments[i];
}
}
foo("There ", "are ", "as ", "much ", "arguments ", "as ", "you ", "want.");