2012-06-16 8 views
5

Per favore perdona il mio inglese. Non sono madrelingua.Come scrivere un || espressione in Javascript dove 0 non è considerato un valore falsy?

mio problema nasce quando scrivo codice come questo

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

Il problema è che 0 si suppone essere un valore valido, ma sarà trascurare perché 0 è falsy in Javascript e sarà impostato sul valore predefinito a destra di ||.

C'è un modo per fare una correzione in modo che 0 non sia considerato falsi?

In questo momento sto facendo

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

ma non mi piace che perché è così a lungo.

+1

Non penso che si possa scrivere più breve di quello. Inoltre, il tuo approccio è ben leggibile, quindi non proverei nemmeno a cambiarlo. – user123444555621

risposta

2

Tutto quello che dovete fare è scrivere una funzione di supporto ...

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

È possibile convertirlo in stringa '0' è truthy:

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

Oppure si può semplicemente utilizzare questo a seconda del vostro input o requisito:

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

'' + number è una scorciatoia per la conversione di un numero a stringa .

+0

''' + undefined' è' "undefined" ', quindi questo non risolve il problema – user123444555621

2

Un modo comune di disporre di opzioni/impostazioni predefinite è .extend() method in jQuery. Pure JS ha anche questo metodo ma con qualcosa di diverso.

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

Questo è quello che vi serve:

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

Credo che dovrebbe essere:' setting = $ .extend ({}, defaultSetting, setting); '. Nella risposta pubblicata sopra, le proprietà in default Impostazioni sovrascrivono quelle nell'impostazione, anche se le proprietà nell'impostazione sono già definite. –

+0

sì, hai ragione. –

+1

Non si fa menzione di jQuery nella domanda. –

1

Messa a punto la versione iniziale di @ codice di 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} 

Non l'ho mai fatto prima. Ma sembra funzionare bene in FF, Chrome e IE9.

Problemi correlati