El objeto arguments

facebook-svg gplus-svg twitter-svg

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")}

Véalo en Codepen!

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 ( "" ).

Vea todos estos ejemplos en codepen