2011-06-18 11 views
31

¿Puede una función de JavaScript tomar argumentos ilimitados? Algo como esto:Argumentos ilimitados en una función de JavaScript

testArray(1, 2, 3, 4, 5...); 

Estoy tratando:

var arr = []; 
function testArray(A) { 
    arr.push(A); 
} 

Pero esto no funciona (la salida es sólo el primer argumento). O la única manera es:

function testArray(a, b, c, d, e...) { 

} 

Gracias

+0

Como alternativa, usted podría tener un parámetro - contenedor "ilimitado" como una matriz (u objeto) y luego pasar todo como una matriz, incluso si solo hay '... ([one_arg])' ... –

+0

Tenga en cuenta que para responder directamente a la pregunta, [No, no puedes.] (Http: // stackoverflow.com/questions/22747068/is-there-a-max-number-of-arguments-javascript-functions-can-accept) – Kaiido

Respuesta

49

Hay una variable extraña "mágica" puede hacer referencia a los llamados "argumentos":

function manyArgs() { 
    for (var i = 0; i < arguments.length; ++i) 
    alert(arguments[i]); 
} 

Es como una matriz, pero no es una matriz. De hecho, es tan extraño que no deberías usarlo demasiado. Una práctica común es conseguir que los valores de la misma en una matriz real de :

function foo() { 
    var args = Array.prototype.slice.call(arguments, 0); 
    // ... 

En ese ejemplo, "args" habría una gama normal, sin ninguna de la rareza. Hay todo tipo de problemas desagradables con "argumentos", y en ECMAScript 5 su funcionalidad se verá reducida.

edición — aunque el uso de la función .slice() seguro que es conveniente, resulta que pasando el objeto arguments de una función causa dolores de cabeza para la optimización, tanto es así que las funciones que hacen que no puede quedar optimizado en absoluto. Por lo tanto, la forma más sencilla, fácil de convertir arguments en una matriz es

function foo() { 
    var args = []; 
    for (var i = 0; i < arguments.length; ++i) args[i] = arguments[i]; 
    // ... 
} 

More about arguments and optimization.

+0

¡Gracias a todos por su respuesta! – rhavd

+3

No hay nada "mágico" o raro en eso, el objeto argumentos se define en ECMA-262. La única similitud que tiene con una matriz es que su propiedad de longitud es una más que su nombre de propiedad numérico más alto. Aparte de eso, es solo un objeto con propiedades. – RobG

+5

Estaba siendo poético :-) Y la variable "arguments" * es * rara, también tiene cosas como la propiedad "callee". – Pointy

1
function toArray() { 
    return arguments; 
} 

var myargs = toArray(1, 2, 3, 4, 5, 6); 

La palabra clave arguments está disponible en todas las funciones JS

+0

'arguments' no es de" tipo "' Array ', es solo una especie de" iterable ", y eso es bastante cojo por parte de JS. –

1
var arr = []; 
function testArray() { 
    Array.prototype.push.apply(arr, arguments); 
} 
10

A partir de ECMAScript 2015 (o ES6) también tenemos acceso a rest parameters que nos da una manera un poco más clara de administrar los argumentos:

function foo(a, b, ...others) { 
    console.log("a and b are ", a, b); 

    for (let val of others) { 
     console.log(val); 
    } 
} 

foo(1, 2, 3, 4, 5); 

En este momento, esto es compatible con Chrome 47+, Firefox 15+ y Edge. La característica también está disponible a través de Babel y TypeScript transpiling down to ES5.

+1

Gracias, esto es exactamente lo que estaba buscando. Especialmente el enlace MDN, simplemente no recuerdo el nombre. :) – Noitidart

1

Con ECMAScript 6, puede utilizar resto de la sintaxis de argumentos:

const testArray = (...args) => { 
    console.log(args); 
}; 

testArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
0

también puede simplemente "fundido" que, ahorrándole el feo bucle:

var getArguments = function() { 
    return arguments; 
}; 

var foo = getArguments(1,2,3,4); 

// console.log(foo.slice()); => TypeError: foo.slice is not a function 

var foo = Object.values(foo); 

console.log(foo); // => [ 1, 2, 3, 4 ] 

foo.push(5); 

console.log(foo); // => [ 1, 2, 3, 4, 5 ] 
Cuestiones relacionadas