Pregunta

Es allí una manera de permitir que "ilimitado" las variables de una función en JavaScript?

Ejemplo:

load(var1, var2, var3, var4, var5, etc...)
load(var1)
¿Fue útil?

Solución

Por supuesto, sólo tiene que utilizar el objeto arguments.

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

Otros consejos

En (la mayoría) de los navegadores recientes, que pueden aceptar un número variable de argumentos con esta sintaxis:

function my_log(...args) {
     // args is an Array
     console.log(args);
     // You can pass this array as parameters to another function
     console.log(...args);
}

Aquí hay un pequeño ejemplo:

function foo(x, ...args) {
  console.log(x, args, ...args, arguments);
}

foo('a', 'b', 'c', z='d')

=>

a
Array(3) [ "b", "c", "d" ]
b c d
Arguments
​    0: "a"
    ​1: "b"
    ​2: "c"
    ​3: "d"
    ​length: 4

Documentación y más ejemplos aquí: https: // developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters

Otra opción es pasar en sus argumentos en un objeto de contexto.

function load(context)
{
    // do whatever with context.name, context.address, etc
}

y utilizar de esta manera

load({name:'Ken',address:'secret',unused:true})

Esto tiene la ventaja de que se puede añadir tantos argumentos con nombre como desee, y la función se pueden utilizar (o no) como lo considere oportuno.

Estoy de acuerdo con la respuesta de Ken como la más dinámica y me gusta tomar un paso más allá. Si se trata de una función que se llama varias veces con diferentes argumentos - utilizo el diseño de Ken pero luego añadir valores por defecto:

function load(context) {

    var defaults = {
        parameter1: defaultValue1,
        parameter2: defaultValue2,
        ...
    };

    var context = extend(defaults, context);

    // do stuff
}

De esta manera, si tiene muchos parámetros, pero no necesariamente tiene necesidad de hacerlo con cada llamada a la función, sólo tiene que especificar los no predeterminados. Para el método de extender, puede utilizar el método extend ($.extend()) de jQuery, crear su propio uso o el siguiente:

function extend() {
    for (var i = 1; i < arguments.length; i++)
        for (var key in arguments[i])
            if (arguments[i].hasOwnProperty(key))
                arguments[0][key] = arguments[i][key];
    return arguments[0];
}

Esto se fusionará con el objeto de contexto y los valores por defecto de llenado en cualquiera de los valores definidos en el objeto con los valores por defecto.

Sí, al igual que este:

function load()
{
  var var0 = arguments[0];
  var var1 = arguments[1];
}

load(1,2);

Es preferible utilizar la sintaxis parámetro resto como Ramast señaló.

function (a, b, ...args) {}

Sólo quiero añadir un poco de buena propiedad de la ... args argumento

  
      
  1. Es una matriz, y no un objeto como argumentos. Esto le permite aplicar funciones como mapa o clasificar directamente.
  2.   
  3. No incluye todos los parámetros, pero sólo el pasado de encendido. P.ej. la función (a, b, ... args) en este caso contiene args   el argumento 3 de arguments.length
  4.   

Como ya se ha mencionado, se puede utilizar el objeto arguments para recuperar un número variable de parámetros de función.

Si desea llamar a otra función con los mismos argumentos, utilice apply. Incluso puede agregar o quitar argumentos mediante la conversión de arguments a una matriz. Por ejemplo, esta función inserta un texto antes de iniciar sesión a la consola:

log() {
    let args = Array.prototype.slice.call(arguments);
    args = ['MyObjectName', this.id_].concat(args);
    console.log.apply(console, args);
}

A pesar de que por lo general de acuerdo en que el enfoque de argumentos con nombre es útil y flexible (a menos que usted se preocupa por el orden, en cuyo caso los argumentos es más fácil), tengo preocupaciones sobre el costo del enfoque mbeasley (usando los valores predeterminados y se extiende). Esta es una cantidad extrema de costos para tomar para tirar de los valores por defecto. En primer lugar, los valores predeterminados se definen dentro de la función, por lo que se vuelve a llenar en cada llamada. En segundo lugar, se puede leer fácilmente los valores con nombre y establecer los valores por defecto, al mismo tiempo usando ||. No hay necesidad de crear y de combinación de otro nuevo objeto de obtener esta información.

function load(context) {
   var parameter1 = context.parameter1 || defaultValue1,
       parameter2 = context.parameter2 || defaultValue2;

   // do stuff
}

Esto es aproximadamente la misma cantidad de código (quizás un poco más), pero debe ser una fracción del costo de tiempo de ejecución.

Mientras @roufamatic hizo mostrar el uso de los argumentos de palabra clave y @Ken mostró un gran ejemplo de un objeto para el uso que yo siento ni verdaderamente abordar lo que está pasando en esta instancia y puede confundir a los lectores futuros o inculcar una mala práctica de no explícita de una función/método está diseñado para tomar una cantidad variable de argumentos/parámetros.

function varyArg () {
    return arguments[0] + arguments[1];
}

Por otro desarrollador cuando está mirando a través de su código es muy fácil de asumir esta función no toma parámetros.Sobre todo si el desarrollador no está al tanto de los argumentos la palabra clave.Debido a esto es una buena idea seguir un estilo de directriz y ser coherente.Voy a estar usando Google para todos los ejemplos.

Vamos a indicar explícitamente la misma función de los parámetros variables:

function varyArg (var_args) {
    return arguments[0] + arguments[1];
}

Parámetro de objeto VS var_args

Puede haber ocasiones cuando un objeto es necesario, ya que éste es el único aprobado y se considera la mejor práctica método de un mapa de datos.Las matrices asociativas son mal vistos y desanimado.

Nota al margen: Los argumentos de palabra clave devuelve un objeto mediante el uso de números como la clave.El prototípico de la herencia es también el objeto de la familia.Véase el final de la respuesta para el correcto uso de array en JS

En este caso podemos indicar explícitamente este también.Nota:esta convención de nomenclatura no es proporcionado por Google, pero es un ejemplo de una declaración explícita de un parámetro de tipo.Esto es importante si usted está mirando para crear un más estricto escribió patrón en el código.

function varyArg (args_obj) {
    return args_obj.name+" "+args_obj.weight;
}
varyArg({name: "Brian", weight: 150});

Cuál elegir?

Esto depende de su función y del programa de necesidades.Si por ejemplo usted está mirando simplemente para devolver un valor de la base en un proceso iterativo a través de todos los argumentos que se pasan a continuación, seguramente con el palo de argumentos la palabra clave.Si usted necesita de la definición de sus argumentos y la asignación de los datos a continuación, el objeto, el método es el camino a seguir.Veamos dos ejemplos y, a continuación, hemos terminado!

Los argumentos de uso

function sumOfAll (var_args) {
    return arguments.reduce(function(a, b) {
        return a + b;
    }, 0);
}
sumOfAll(1,2,3); // returns 6

La utilización de objetos

function myObjArgs(args_obj) {
    // MAKE SURE ARGUMENT IS AN OBJECT OR ELSE RETURN
    if (typeof args_obj !== "object") {
        return "Arguments passed must be in object form!";
    }

    return "Hello "+args_obj.name+" I see you're "+args_obj.age+" years old.";
}
myObjArgs({name: "Brian", age: 31}); // returns 'Hello Brian I see you're 31 years old

El acceso a una matriz en lugar de un objeto ("...args" El resto de parámetros)

Como se mencionó en la parte de arriba de la respuesta de la argumentos palabra clave devuelve un objeto.Debido a esto cualquier método que desea utilizar para una matriz tendrá que ser llamado.Un ejemplo de esto:

Array.prototype.map.call(arguments, function (val, idx, arr) {});

Para evitar este tipo de uso que el resto de los parámetros:

function varyArgArr (...var_args) {
    return var_args.sort();
}
varyArgArr(5,1,3); // returns 1, 3, 5

Utilice el objeto arguments cuando dentro de la función para tener acceso a todos los argumentos pasados.

Tenga en cuenta que la aprobación de un objeto con propiedades denominadas como sugiere Ken agrega el costo de asignar y liberar el objeto temporal para cada llamada. Pasando argumentos normales por valor o referencia será generalmente el más eficiente. Para muchas aplicaciones, aunque el rendimiento no es crítico, pero para algunos puede ser.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top