2013-09-30 9 views
88

Amo il meccanismo ||= di Ruby. Se una variabile non esiste o è nil, quindi creare e impostarlo uguale a qualcosa:Ruby's || = (o uguale a) in JavaScript?

amount # is nil 
amount ||= 0 # is 0 
amount ||= 5 # is 0 

ho bisogno di fare qualcosa di simile in JavaScript ora. Qual è la convenzione o il modo corretto per farlo? So che ||= non è una sintassi valida. 2 modi ovvi per gestirlo sono:

window.myLib = window.myLib || {}; 

// or 

if (!window.myLib) 
    window.myLib = {}; 

risposta

105

Entrambi sono assolutamente corretta, ma se siete alla ricerca di qualcosa che funziona come ||= in Ruby. Il primo metodo che è variable = variable || {} è quello che si sta cercando :)

14

È possibile utilizzare l'operatore logico OR || che valuta il suo operando di destra se lVal è un valore falsy.

valori Falsy includono per esempio null,false,0,"",undefined,NaN

var x = x || 1;

-2

Ruby's || = assegnazione cortocircuiti operatore. Esso può essere pensato in questo modo:

return a || a = b 

Quindi, in javascript, questo sembra molto simile:

return a || (a = b); 

Sembra come sottolineato nei commenti qui sotto però, che questa forma rubino letterale è meno efficiente rispetto allo standard javascript idiom a = a || b.

Per riferimento: http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

+0

In pratica sembra che il 'a = a || la forma di b' è più ottimale http://jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3 – jchook

+0

un ottimo strumento. che aspetto ha se x ha un valore e così corto circuito? – chris

+0

Credo che il teardown debba essere esplicito su jsperf quindi [questo test] (http://jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/4) dovrebbe mostrare le prestazioni di corto circuito. La mia ipotesi è che V8 abbia un'ottimizzazione speciale per il modulo 'a = a || b'. – jchook

4

Se si lavora con gli oggetti, è possibile utilizzare destrutturazione (dal ES6) in questo modo:

({ myLib: window.myLib = {} } = window); 

... ma non si guadagna nulla più la risposta accettata tranne la confusione.

Problemi correlati