2010-09-08 16 views
11

Así que he estado haciendo esto durante el tiempo que puedo recordar, pero tengo curiosidad si esto es realmente lo que debería estar haciendo. Usted escribe una función que toma un parámetro, por lo que anticipa que tendrá un valor, pero si no lo hace, tiene una buena razón para predeterminarlo, por ejemplo, cero. Actualmente lo que hago es escribir una función auxiliar:Valor predeterminado para el parámetro de función?

function foo() { return foo(0); }; 
function foo(bar) { ... }; 

Acabo de funcionar a través de una instancia donde hice esto y lo miraba curiosamente durante unos segundos antes de entender mi lógica detrás de él. Vengo de php donde es trivial:

function foo(bar=0) { ... } 

¿Existe una alternativa javascript que no estoy al tanto?

+0

duplicados de http://stackoverflow.com/questions/148901/is-there -a-better-way-to-do-optional-function-parameters-in-javascript – BGerrissen

Respuesta

16

No puede haber funciones sobrecargadas en JavaScript. En su lugar, utilice la inicialización basada en objetos o verifique los valores y asigne un valor predeterminado si no se proporciona ninguno.

En su ejemplo, la segunda función foo(bar) reemplazará la primera.

Aquí hay una función que usa la inicialización de objetos.

function foo(config) { 
    extend(this, config); 
} 

donde extend es una función que se funde el objeto de configuración con el objeto actual. Es similar al método $.extend en jQuery, o al método $extend de MooTools.

invocar la función y pasarlo nombrado pares de valores clave

foo({ bar: 0 }); 

La otra manera de inicializar es mirar a los valores suministrados, y asignar un valor predeterminado si no se le da el valor

function foo(bar) { 
    bar = bar || 0; 
} 

Esto funciona siempre que la barra no sea un valor falso. Por lo tanto, foo(false) o foo("") aún se inicializarán bar a 0. Para tales casos, haga una comprobación explícita.

function foo(bar) { 
    bar = (typeof bar == 'undefined' ? 0 : bar); 
} 
5

En JavaScript, el argumento no estará definido si el usuario no lo transfirió. Puede usar el || operador para establecer el valor del argumento si no está definido:

function foo(bar) { 
    bar = bar || 0; 
    ... 
} 
+5

es mejor que compruebe 'bar === undefined' en lugar de hacer esta simple prueba. – jrharshath

+0

@jrharshath Acabo de descubrir 'variable === undefined' es incorrecto solo porque undefined es en realidad una variable indefinida, no una palabra reservada. Entonces, si asigna previamente 'undefined = true;' y luego prueba 'alert (x === undefined) // devuelve false' Entonces debe escribir check usando' typeof variable === undefined' –

+1

Esta respuesta es incorrecta, porque usted no puede pasar 0 ni falso ni nulo. Ejemplo: si la barra es verdadera por defecto como esta 'bar = bar || verdadero "no se puede pasar falso, la barra siempre será verdadera". –

1

La forma más sencilla que conozco es probar un valor y luego establecerlo en un valor predeterminado si no se encuentra ningún valor. Todavía no me he encontrado con un trazador de líneas único, esto es lo mejor que tengo.

Si espera un valor de cadena, utilice esto. Por defecto se disparará en estos valores: [indefinido, null, ""]

function foo(str) { 
    str = !!str ? str : 'bar'; 
    ... 
} 

Si espera un número o valor booleano. Esto permite 0 y falso como valores.Por defecto se disparará en [indefinidos, null, {}, funciones]

útil para hacer los valores de los argumentos que sólo aceptan valores primitivos como el número, booleano y la cadena

function foo(val) { 
    val= !!val == val || val*1 ? val : 10; 
    ... 
} 

Si usted está buscando para la prueba de los objetos como {}, hay documentación sobre cómo hacer esto, pero no es tan simple.

0

Esperamos que esto responde a un poco más claro para alguien - Terminé usando el viejo comprobar indefinido if(typeof functionparameter !== 'undefined') según:

$.fn.extend({ 
    doThing: function(stringparameter = 'FooBar!', functionparameter){ 
     console.log('Here is your string '+stringparameter); 
     // Run it if it's been passed through: 
     if(typeof functionparameter !== 'undefined') functionparameter(); 
}); 
Cuestiones relacionadas