2009-02-03 21 views
14

quello che sarebbe il modo più idiomatico per effettuare le seguenti operazioni in JavaScript:modo idiomatico per impostare il valore di default in javascript

Se myParam non viene passato in MyFunc dal chiamante, allora voglio impostarlo su un valore predefinito . Ma prima voglio cercare di ottenere da un altro oggetto, che non può ancora esistere:

function MyFunc(myParam) { 

    if (!myParam) { 
     if (!myObj) { 
      myParam = 10; 
     } 
     else { 
      myParam = myObj.myParam; 
     } 
    } 

    alert(myParam); 
} 

ho iniziato a scrivere:

myParam = myParam || myObj.mParam || 10 

ma si rese conto che se myObj non esiste allora questo fallirebbe . Posso indovinare quanto segue:

myParam = myParam || (myObj && myObj.mParam) || 10 

Potrebbe anche funzionare. Ma è il modo migliore?

Come farebbe ad esempio John Resig?

+0

myParam = myParam || (myObj || {}). myParam || 10 – Hafthor

risposta

17

Se myObj è globale, è necessario fare riferimento all'oggetto della finestra, altrimenti genererà un errore se myObj non è definito.

myParam = myParam || (window.myObj ? window.myObj.mParam : 10); 

o

myParam = myParam || (window.myObj && window.myObj.mParam) || 10; 

Questo metodo funziona così:

myParam = myParam || ((typeof myObj !== "undefined") ? myObj.mParam : 10); 
+0

genera un errore se myObj non esiste. – Triptych

+0

Sì, ha trascurato quello. –

+0

Ricorda che 0, stringa vuota, null, false, NaN e indefinito sono tutti falsi e nei due esempi sopra ti fornirai il valore predefinito. Nel terzo esempio si ottiene il valore predefinito solo se myObj non è definito, indipendentemente dal fatto che myObj.mParam sia assegnato o meno. – some

0

penso che le altre risposte hanno dimostrato che ci sono un sacco di modi una battuta può fallire qui. La mia versione di seguito è forse più leggibile e non verifica esplicitamente l'esistenza dell'oggetto/proprietà, ma non è molto più breve:

function MyFunc(myParam){ 
    if (!myParam){ 
     try{ 
      myParam = myObj.myParam; 
     } 
     catch(e){ 
      myParam = 10; 
     } 
    } 
} 
+0

Penso che sia più leggibile –

Problemi correlati