El objeto arguments
El objeto arguments es una variable local disponible dentro de todas las funciones JavaScript que contiene todos los argumentos pasados a la función. Esto abre un montón de posibilidades porque podemos crear una función sin saber desde el principio el número exacto de argumentos necesarios.
Pruebe lo siguiente y no olvide abrir su consola:
function testArguments(){
console.log(arguments);
}
testArguments(1,2,3,4);// devuelve el objeto arguments
Probemos algo más práctico: por ejemplo podemos crear una función total()
que devuelve la suma de sus argumentos:
function total() {
 var total = 0;
     for( var i = 0; i < arguments.length; i++){total += arguments[i]};
 return total;
}
console.log(total(1, 2, 3, 4, 5));// devuelve 15
console.log(total(1, 2, 3, 4, 5, 6, 7, 8, 9));// devuelve 45
¿Que pasa si en este caso pasamos un array como argumento?
var ry = [1, 2, 3, 4, 5, 6, 7, 8, 9];
total( ry ); // devuelve una cadena de texto "01,2,3,4,5,6,7,8,8,9";
Lo que pasa es que JavaScript no sabe como sumar un número ( 0
) con un array ( ry
), así que los transforma en cadenas de texto y los concadena.
Cómo podemos saber si és un array
Podemos modificar la función total()
para que aceptara un array de números como argumento, pero primero veamos cómo podemos comprobar si se trata de un array. Hay varias soluciones:
1. Podemos comprobar si el constructor es Array
.
if (miArray.constructor === Array){console.log("es verdad");}
2. Podemos utilizar el operador instanceof para comprobar si el objeto miArray es una instancia del constructor Array
.
if(miArray instanceof Array){console.log("es un array")}
3. Podemos utilizar el método Array.isArray() que determina si el valor pasado es un Array.
if( Array.isArray(miArray) ){console.log("test isArray")}
4. Podemos utilizar el método toString para detectar la clase de objeto.
if(Object.prototype.toString.call(miArray) ==Â "[object Array]"){console.log("este sí que és Array")}
Para comprobar si el argumento proporcionado es un array voy a utilizar el operador instanceof
. Si se trata de un array, la función lo utiliza, de lo contrario, utiliza el objeto arguments
.
function total1(a) {
 var total = 0;
 var arg;
 // si el argumento proporcionado es un array
 if (a instanceof Array) {
   arg = a;// utilice este array
 } else {  // de lo contrario
   arg = arguments; // utilice el objeto arguments
 }
 for( var i = 0; i < arg.length; i++){total += arg[i]};
return total;
}
En ES6 es algo más fácil: basta con utilizar el operador spread para expandir el array utilizado como argumento:
console.log(total(...[1, 2, 3, 4, 5, 6, 7, 8, 9])); // devuelve 45
Argumentos opcionales en JavaScript
Podemos nombrar algunos argumentos y utilizar el objeto arguments
en el mismo tiempo. Por ejemplo podemos escribir una función que toma dos argumentos obligatorios, y los demás opcionales. Pruebe lo siguiente y no olvide abrir su consola:
function argumentsNombres(a,b){
 console.log(arguments)
}
argumentsNombres("a", "b", 1, 3, 4, 56, 7);// devuelve el objeto arguments
En ES6 podemos agrupar el resto de los argumentos en un array utilizando la sintaxis de los demás parámetros (the ...rest of parameters):
function ES6_argumentsNombres(a,b,...losDemasArgumentos){
console.log(a,b, losDemasArgumentos)
}
ES6_argumentsNombres("a","b",1,3,4,56,7); // devuelve "a" "b" [1, 3, 4, 56, 7]
Otra manera de crear argumentos opcionales en JavaScript es utilizando el operador lógico or ( ||
);
Pruebe lo siguiente:
console.log( false || 1); // devuelve 1
console.log( undefined || 2); // devuelve 2
console.log( null || 3); // devuelve 3
console.log( NaN || 6); // devuelve 6
console.log( 0 || 4); // devuelve 4
console.log( "" || 5); // devuelve 5
console.log( 8 || 7); // devuelve 8
console.log( "" || null || undefined || 4 || 5); // devuelve 4
En todos estos casos el operador lógico escoge el primer valor que no es false
, undefined
, null
, NaN
, 0
o una cadena de texto vacía ( ""
).