2011-01-22 16 views
7

En algunos idiomas se pueden establecer valores predeterminados para los argumentos de la función:JS: funciones argumentos valores por defecto

function Foo(arg1 = 50, arg2 = 'default') { 
    //... 
} 

¿Cómo lo haces en JavaScript?

+0

posible duplicado de [Establecer un valor de parámetro predeterminado para una función de JavaScript] (http://stackoverflow.com/questions/894860/set- a-default-parameter-value-for-a-javascript-function) – vaxquis

+0

posible duplicado de [¿Hay una forma mejor de hacer los parámetros de funciones opcionales en Javascript?] (http: // stackoverflow. com/questions/148901/is-there-a-better-way-to-do-optional-function-parameters-in-javascript) – vaxquis

Respuesta

15

En JavaScript, todo lo que no se establece recibe el valor undefined. Esto significa que si desea establecer los valores por defecto para una función, su primera línea tiene que ser una comprobación para ver si estos valores no están definidos:

function Foo(arg1, arg2) { 
    if (typeof(arg1) === "undefined") { arg1 = 50; } 
    if (typeof(arg2) === "undefined") { arg2 = "default"; } 
} 

se puede tomar un poco de un atajo si saber aproximadamente cuáles serán esos valores:

function Foo(arg1, arg2) { 
    arg1 = arg1 || 50; 
    arg2 = arg2 || "default"; 
} 

Sin embargo, si esos argumentos son falsos, serán reemplazados. Esto significa que si arg1 es una cadena vacía, null, undefined, false o 0 que va a ser cambiado a 50, por lo que debe tener cuidado si decide utilizarlo

1

Usted tendría que hacerlo en el cuerpo de la función:

function Foo(arg1 ,arg2) { 
    if(typeof arg1 === 'undefined') 
     arg1 = 50; 

    if(typeof arg2 === 'undefined') 
     arg2 = 'default'; 
    //... 
} 

Otra manera de probarlas para undefined o null es así:

function Foo(arg1 ,arg2) { 
    if(arg1 == undefined) 
     arg1 = 50; 

    if(arg2 == undefined) 
     arg2 = 'default'; 
    //... 
} 

Algunas personas no les gusta porque es posible anular el valor de undefined ya que es solo una propiedad global. Mientras no se anule, esto funcionaría bien. Si los parámetros son null o undefined, se establecerán en un valor predeterminado.

5

prefiero el == null cheque en lugar de typeof(arg1) === undefined (como jQuery la biblioteca lo hace internamente: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint). No solo es más conciso, también maneja tanto nulo como indefinido, de modo que el código del cliente puede pasar en null y obtener el valor predeterminado aplicado.

También es posible ajustar la función en otra función que proporcione valores predeterminados. La biblioteca prototypejs tiene una función que suministra el argumentNames() (o si no quiere usar un prototipo, puede tomar prestada la implementación, es solo una expresión regular aplicada a los resultados de la función toString()).

por lo que podría hacer algo como esto:

var Foo = defaults(Foo, { arg1: 50, arg2: 'default' }); 
function Foo(arg1, arg2) { 
    //... 
} 

y la implementación de defaults() sería algo como esto:

function defaults(fn, def) { 
    return function() { 
    var arg_names = fn.argumentNames(); 
    var nArgs = args.length; 
    for (var nArg = 0; nArg < nArgs; ++nArg) { 
     if (arguments[nArg] == null && arg_names[nArg] in def) 
     arguments[nArg] = def[arg_names[nArg]]; 
    } 
    fn.apply(this, arguments); 
    } 
} 

Por supuesto, eso es código no probado y de la forma en que está escrito, requiere la biblioteca Prototype.Pero todo lo dicho, el enfoque == null dentro de la función es más natural para Javascript, es más fácil de depurar (que no tiene otra capa función al paso a través), y me resulta más fácil de leer:

function Foo(arg1, arg2) { 
    if (arg1 == null) arg1 = 50; 
    if (arg2 == null) arg2 = 'default'; 
} 
+0

Gracias por la respuesta. Por cierto, las directrices de jQuery requieren llaves para ser utilizadas en bloques. Yo prefiero esto también Así que supongo que algo como 'arg1 == null && arg1 = 50' sería correcto (no estoy seguro de la prioridad de los operadores en JS)? – SaltLake

1

a partir de ES2015 (ES6), los parámetros por defecto se pueden configurar de este modo:

function multiply (a, b = 2) { 
    return a * b; 
} 
multiply(5); // 10 
Cuestiones relacionadas