2012-06-16 10 views
5

Por favor, perdona mi inglés. No soy un hablante nativo¿Cómo escribo un || expresión en Javascript donde 0 no se trata como un valor falsy?

Mi problema viene cuando escribo código como este

luminosity = settings.luminosity || 50; 
opacity = settings.opacity || 100; 

El problema es que 0 se supone que es un valor válido, pero será por alto porque 0 es Falsy en Javascript y pondré a la valor predeterminado a la derecha de ||.

¿Hay alguna manera de solucionarlo, por lo que 0 no se trata como falsy?

En este momento estoy haciendo

luminosity = "luminosity" in settings ? settings.luminosity : 50; 

pero no me gusta eso, porque es muy largo.

+1

No creo que puedas escribirlo más corto que eso. Además, su enfoque es bien legible, por lo que ni siquiera trataría de cambiarlo. – user123444555621

Respuesta

2

Todo lo que necesita hacer es escribir una función de ayuda ...

function ifNotSet(val, other) { 
    return typeof val === "undefined" ? other : val; 
} 
2

Puede convertirlo a cadena '0' es truthy:

luminosity = settings.luminosity === 0 ? '' + settings.luminosity : settings.luminosity || 50; 
opacity = settings.opacity === 0 ? '' + settings.opacity : settings.opacity || 100; 

o simplemente puede usar esta función de su entrada o requisito:

luminosity = '' + settings.luminosity || 50; 
opacity = '' + settings.opacity || 100; 

'' + number es la abreviatura para la conversión de un número de secuencia .

+0

''' + undefined' es' "undefined" ', por lo que esto no resuelve el problema – user123444555621

2

Una forma común de tener opciones/configuraciones predeterminadas es .extend() method in jQuery. Pure JS también tiene este método, pero con algunos diferentes.

/* merge object2 into object1 */ 
$.extend(object1, object2); 

Esto es lo que necesita:

var defaultSetting = {luminosity : 50, opacity : 100}; 
setting = $.extend({}, defaultSetting, setting); 
+0

Creo que debería ser:' setting = $ .extend ({}, defaultSetting, setting); '. En la respuesta publicada anteriormente, las propiedades en defaultSetting sobreescriben aquellas en la configuración, incluso si las propiedades en la configuración ya están definidas. –

+0

sí, tienes razón. –

+1

No hay mención de jQuery en la pregunta. –

1

Afinando la versión inicial del código de Tooraj @ :

var setting = {luminosity:0}; 
var defaultSetting = {luminosity:50, opacity:100}; 

setting = $.extend({}, defaultSetting, setting); 

// setting now has a value of {luminosity:0, opacity:100} 

No he hecho esto antes. Pero parece funcionar bien en FF, Chrome e IE9.

Cuestiones relacionadas