El objeto arguments

arguments es un objeto similar a Array accesible dentro de funciones que contiene los valores de los argumentos pasados a esa funci贸n.

Descripci贸n

Nota: Si est谩s escribiendo c贸digo compatible con ES6, entonces se deben preferir los par谩metros resto.

Nota: "similar a Array" significa que arguments tiene una propiedad lenght y propiedades indexadas desde cero, pero no tiene m茅todos integrados de Array como forEach() o map(). Ve la 搂Descripci贸n para obtener m谩s detalles.

El objeto arguments es una variable local disponible en todas las funciones que no son funciones flecha. Puedes hacer referencia a los argumentos de una funci贸n dentro de esa funci贸n utilizando su objeto arguments. Tiene entradas para cada argumento con el que se llam贸 a la funci贸n, con el 铆ndice de la primera entrada en 0.

Por ejemplo, si a una funci贸n se le pasan 3 argumentos, puedes acceder a ellos de la siguiente manera:

arguments[0] // primer argumento
arguments[1] // segundo argumento
arguments[2] // tercer argumento

Tambi茅n puedes establecer o reasignar cada argumento:

arguments[1] = 'new value';

El objeto arguments no es un Array. Es similar, pero carece de todas las propiedades de Array excepto de length. Por ejemplo, no tiene el m茅todo pop().

Sin embargo, se puede convertir en un Array real:

var args = Array.prototype.slice.call(arguments);
// El uso de un arreglo literal es m谩s corto que el anterior pero asigna un arreglo vac铆o
var args = [].slice.call(arguments);

As铆 como puedes hacer con cualquier objeto tipo Array, puedes usar el m茅todo Array.from() de ES2015 o la propagaci贸n de sintaxis para convertir arguments en un arreglo real:

let args = Array.from(arguments);
// o
let args = [...arguments];

El objeto arguments es 煤til para funciones llamadas con m谩s argumentos de los que declara aceptar formalmente. Esta t茅cnica es 煤til para funciones a las que se les puede pasar un n煤mero variable de argumentos, como Math.min(). Esta funci贸n de ejemplo acepta cualquier n煤mero de argumentos de cadena y devuelve la m谩s larga:

function longestString() {
  var longest = '';
  for (var i=0; i < arguments.length; i++) {
    if (arguments[i].length > longest.length) {
      longest = arguments[i];
    }
  }
  return longest;
}

Puedes usar arguments.length para contar con cu谩ntos argumentos se llam贸 a la funci贸n. Si, en cambio, deseas contar cu谩ntos par谩metros se declara que acepta una funci贸n, inspecciona la propiedad length de esa funci贸n.

Usar typeof con arguments

El operador typeof devuelve 'object' cuando se usa con arguments

console.log(typeof arguments); // 'object' 

El tipo de argumentos individuales se puede determinar indexando arguments:

console.log(typeof arguments[0]); // devuelve el tipo del primer argumento

Propiedades

arguments.callee
Referencia a la funci贸n en ejecuci贸n a la que pertenecen los argumentos. Prohibida en modo estricto.
arguments.length
El n煤mero de argumentos que se pasaron a la funci贸n.
arguments[@@iterator]
Devuelve un nuevo objeto Array iterator que contiene los valores de cada 铆ndice en arguments.

Ejemplos

Definici贸n de una funci贸n que concatena varias cadenas

Este ejemplo define una funci贸n que concatena varias cadenas. El 煤nico argumento formal de la funci贸n es una cadena que contiene los caracteres que separan los elementos a concatenar.

function myConcat(separator) {
  let args = Array.prototype.slice.call(arguments, 1);
  return args.join(separator);
}

Puedes pasar tantos argumentos como desees a esta funci贸n. Devuelve una lista de cadenas usando cada argumento en la lista:

// returns "red, orange, blue"
myConcat(', ', 'red', 'orange', 'blue');

// devuelve "elephant; giraffe; lion; cheetah"
myConcat('; ', 'elephant', 'giraffe', 'lion', 'cheetah');

// devuelve "sage. basil. oregano. pepper. parsley"
myConcat('. ', 'sage', 'basil', 'oregano', 'pepper', 'parsley');

Definici贸n de una funci贸n que crea listas HTML

Este ejemplo define una funci贸n que crea una cadena que contiene HTML para una lista. El 煤nico argumento formal para la funci贸n es una cadena que es "u" si la lista debe estar desordenada (con vi帽etas), u "o" si la lista es ordenada (numerada). La funci贸n se define de la siguiente manera:

function list(type) {
  var html = '<' + type + 'l><li>';
  var args = Array.prototype.slice.call(arguments, 1);
  html += args.join('</li><li>');
  html += '</li></' + type + 'l>'; // fin de la lista
  return html;
}

Puedes pasar cualquier n煤mero de argumentos a esta funci贸n y agregar cada argumento como un elemento de lista a una lista del tipo indicado. Por ejemplo:

let listHTML = list('u', 'One', 'Two', 'Three');

/* la listHTML es:
"<ul><li>One</li><li>Two</li><li>Three</li></ul>"
*/

Par谩metros rest, predeterminados y desestructurados

El objeto arguments se puede utilizar junto con par谩metros rest, predeterminados y desestructurados.

function foo(...args) {
  return args;
}
foo(1, 2, 3); // [1, 2, 3]

Si bien la presencia de par谩metros rest, predeterminados o desestructurados no altera el comportamiento del objeto arguments en el c贸digo de modo estricto, existen sutiles diferencias para el c贸digo no estricto.

En el c贸digo de modo estricto, el objeto arguments se comporta de la misma manera independientemente de que se pasen par谩metros rest, predeterminados o desestructurados a una funci贸n. Es decir, asignar nuevos valores a las variables en el cuerpo de la funci贸n no afectar谩 al objeto arguments. La asignaci贸n de nuevas variables al objeto arguments tampoco afectar谩 el valor de las variables.

Nota: No puedes escribir una directiva "use strict"; en el cuerpo de una definici贸n de funci贸n que acepte par谩metros rest, predeterminados o desestructurados. Si lo haces, generar谩 un error de sintaxis.

Las funciones no estrictas a las que se les pasan solo par谩metros simples (es decir, no par谩metros rest, predeterminados o desestructurados) sincronizar谩n el valor de los nuevos valores de las variables en el cuerpo de la funci贸n con el objeto arguments, y viceversa:

function func(a) {
  arguments[0] = 99; // actualiza arguments[0] adem谩s actualiza a
  console.log(a);
}
func(10); // 99

Y tambi茅n:

function func(a) {
  a = 99; // la actualizaci贸n tambi茅n actualiza arguments[0]
  console.log(arguments[0]);
}
func(10); // 99

Por el contrario, las funciones no estrictas a las que se les pasan par谩metros rest, predeterminados o desestructurados no sincronizar谩n los nuevos valores asignados a las variables de los argumentos en el cuerpo de la funci贸n con el objeto arguments. En cambio, el objeto arguments en funciones no estrictas con par谩metros complejos siempre reflejar谩n los valores pasados a la funci贸n cuando se invoc贸 (este es el mismo comportamiento exhibido por todas las funciones en modo estricto, independientemente del tipo de variables que se le pasen):

function func(a = 55) {
  arguments[0] = 99; // actualizar arguments[0] tampoco actualiza a
  console.log(a);
}
func(10); // 10

Y tambi茅n:

function func(a = 55) {
  a = 99; // actualizar a tampoco actualiza arguments[0]
  console.log(arguments[0]);
}
func(10); // 10

Y tambi茅n:

// Un par谩metro predeterminado sin seguimiento
function func(a = 55) {
  console.log(arguments[0]);
}
func(); // undefined

Especificaciones

Compatibilidad del navegador

BCD tables only load in the browser

Ve tambi茅n