2012-03-25 15 views
35

mi chiedo se c'è un modo più breve per scrivere questo:Stenografia if/else Javascript

var x = 1; 
if(y != undefined) x = y; 

inizialmente ho provato x = y || 1, ma che non ha funzionato. Qual è il modo corretto di fare questo?

+0

'x = y || x' funziona se non si cura di rigorosa ** ** indefinito – Nemesarial

risposta

73
var x = y !== undefined ? y : 1; 

Nota che var x = y || 1; assegnerebbe 1 per ogni caso in cui y è falsy (ad esempio false, 0, ""), che può essere il motivo per cui "non ha funzionato" per voi. Inoltre, se è una variabile globale, se è veramente non definita, è possibile che si verifichi un errore a meno che non lo acceda come window.y.


Come vol7ron suggerisce nei commenti, è possibile utilizzare anche typeof per evitare la necessità di fare riferimento a vars globali come window.<name>:

var x = typeof y != "undefined" ? y : 1; 
+0

Yay per gli operatori ternari. Ci proverò. Modifica: Ah, ok. Che dire di "indefinito"? Non sembra averlo capito. –

+0

Cosa intendi? La stringa ''undefined'' è un valore vero e non è uguale al valore effettivo' indefinito'. – Amber

+0

Intendevo, dove la variabile non è stata dichiarata affatto. So che la stringa "indefinita" valuta un valore booleano vero, ma non è quello che stavo cercando. –

3
y = (y != undefined) ? y : x; 

La parentesi non sono necessari, ho appena aggiungo loro perché penso che sia più facile leggere in questo modo.

+3

I tuoi paren sono sbilanciati (e anche non necessari). – Amber

+0

@Amber Nel momento in cui inizi a usare la stenografia di javscript, stai già dicendo che non ti preoccupi della leggibilità, quindi perché preoccuparsi di un parental equilibrato ?. –

13

Un altro modo di scriverlo a breve

bePlanVar = !!((bePlanVar == false)); 

// is equivalent to 

bePlanVar = (bePlanVar == false) ? true : false; 

// and 

if (bePlanVar == false) { 
    bePlanVar = true; 
} else { 
    bePlanVar = false; 
} 
1

altro modo che ternario, utilizzando cortocircuito:

typeof y !== 'undefined' && y || 1

Anche se io continuo a pensare ternario più leggibile ...

0

Ecco un modo per farlo funziona, ma potrebbe non essere la pratica migliore per qualsiasi lingua in realtà:

var x,y; 
x='something'; 
y=1; 
undefined === y || (x = y); 

alternativa

undefined !== y && (x = y); 
+0

Appena notato che questo è stato già fornito da @AndreFigueiredo – Nemesarial