770 votos

¿Hay una manera mejor de hacer opcional parámetros de la función en Javascript?

Siempre he manejado parámetros opcionales en Javascript como este:

function myFunc(requiredArg, optionalArg){
  optionalArg = optionalArg || 'defaultValue';

  //do stuff

}

¿Hay una mejor manera de hacerlo?

Hay casos donde el uso de || como el que va a fracasar?

1025voto

Paul Dixon Puntos 122033

Su lógica falla si optionalArg se pasa, pero se evalúa como false - tratar esto como una alternativa

optionalArg = (typeof optionalArg === "undefined") ? "defaultValue" : optionalArg;

125voto

trusktr Puntos 4518

Me parece que esta es la más simple, más legible:

if (typeof myVariable === 'undefined') { myVariable = 'default'; }
//use myVariable here

Paul Dixon de la respuesta (en mi humilde opinión) es menos legible que este, pero se trata de la preferencia.

insin la respuesta es mucho más avanzado, pero mucho más útil para las grandes funciones!

EDITAR 11/17/2013 9:33pm: he creado un paquete para Node.js eso hace que sea más fácil a la "sobrecarga" de las funciones (métodos) llamado paramétrico.

124voto

Lachlan Hunt Puntos 716

ECMAScript 6 proyecto actualmente incluye la capacidad para declarar valores de parámetros por defecto en la declaración de la función.

function myFunc(requiredArg, optionalArg = 'defaultValue') {
    // do stuff
}

Pero esto es actualmente sólo es compatible con Firefox. Ver los parámetros por defecto en el MDN.

44voto

Oli Puntos 65050

Si usted necesita a chuck literal NULL , entonces usted podría tener algunos problemas. Aparte de eso, no, yo creo que probablemente usted está en el camino correcto.

El otro método que algunas personas optan está tomando un assoc matriz de variables de la iteración a través de la lista de argumentos. Se ve un poco más limpio, pero me imagino que es un poco (muy poco) poco más o proceso intensivo de memoria.

function myFunction (argArray) {
    var defaults = {
    	'arg1'	:	"value 1",
    	'arg2'	:	"value 2",
    	'arg3'	:	"value 3",
    	'arg4'	:	"value 4"
    }

    for(var i in defaults) 
    	if(typeof argArray[i] == "undefined") 
        	   argArray[index] = defaults[i];

    // ...
}

32voto

user568458 Puntos 3511

Lo ideal sería que refactorizar para pasar un objeto y combinar con un objeto predeterminado, de modo que el orden en el que los argumentos se pasan no importa (ver más abajo).

Sin embargo, si sólo desea algo rápido, fiable, fácil de usar y no voluminosos, intente esto:


Una limpieza rápida solución para cualquier número de argumentos predeterminados

  • Las escalas elegantes: un mínimo de código adicional para cada nuevo valor predeterminado
  • Puedes pegarlo en cualquier parte: sólo tienes que cambiar el número de argumentos y variables
  • Si desea pasar undefined a un argumento con un valor por defecto, de esta manera, se establece la variable como undefined. La mayoría de las otras opciones de esta página reemplazaría undefined con el valor predeterminado.

He aquí un ejemplo para proporcionar valores predeterminados para los tres argumentos opcionales (con dos argumentos obligatorios)

function myFunc(reqOne,reqTwo, optOne,optTwo,optThree) {

  switch (arguments.length - 2) { // <-- 2 is number of required arguments
    case 0:  optOne = 'Some default';
    case 1:  optTwo = 'Another default';
    case 2:  optThree = 'Some other default';
  }

}

(intencionalmente sin descanso entre los casos: cada caso implica la siguiente casos también son verdaderos)

Esto es similar a roenving la respuesta, pero fácilmente extensible para cualquier número de argumentos predeterminados, más fácil de actualizar, y utilizando arguments no Function.arguments.


Pasa y combinar objetos para obtener más flexibilidad

El anterior código, al igual que muchas formas de hacerlo predeterminado argumentos, no se puede pasar argumentos de la secuencia, por ejemplo, pasando optThree pero dejando optTwo para caer de nuevo a su predeterminada.

Una buena opción para que se pase a objetos y la correspondencia con un objeto predeterminado. Esto también es bueno para el mantenimiento.

Ejemplo de uso de jQuery (que podrían, en cambio, utilizar guión bajo del _.defaults(object, defaults) o examinar estas opciones):

function myFunc( args ) {
  var defaults = {
    optOne: 'Some default',
    optTwo: 'Another default',
    optThree: 'Some other default'
  };
  args = $.extend({}, defaults, args);

  console.log(args.optOne, args.optTwo, args.optThree);
}

// example using it
myFunc({
  optOne: "We'll override optOne and optThree...",
  optThree: "...leaving optTwo to use its default."
});

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X