2013-03-26 13 views
10

Durante la lettura della documentazione di Coffeescript, sono stato confuso dallo scant documentation on existential operators. La documentazioneOperatori condizionali di assegnazione esistenziali in Coffeescript

It (?=) può essere utilizzato anche per rendere più sicuri assegnazione condizionale di ||= prevede, per i casi in cui si può essere la manipolazione numeri o stringhe.

Qual è la differenza tra il ?= e ||= operatore e quando si dovrebbe essere usato contro l'altro?

risposta

18

? e || verificano condizioni completamente diverse (ma sovrapposte).

L'operatore || funziona esattamente allo stesso modo come avviene in JavaScript quindi le cose come 0 e '' sono Falsey quanto || è interessato; || controlla la sincerità in senso JavaScript.

L'operatore ? viene convertito nel == null JavaScript in modo a ? b è solo b quando a è null o undefined; ? controlla la definizione nel senso di CoffeeScript.

considerare questi:

for v in [false, 0, '', null, undefined, 6] 
    do (v) -> 
     a = v 
     a ||= 'pancakes' 
     console.log("#{v} ||= 'pancakes':", a) 

for v in [false, 0, '', null, undefined, 6] 
    do (v) -> 
     a = v 
     a ?= 'pancakes' 
     console.log("#{v} ?= 'pancakes':", a) 

Il primo ciclo vi darà cinque frittelle e una 6, il secondo ciclo vi darà una false, 0, '', due frittelle e un 6.

Demo: http://jsfiddle.net/ambiguous/PdLDe/1/

Quindi, se volete solo il comportamento in stile JavaScript (vale a dire 0, false, e '' devono essere ignorati) allora probabilmente si desidera ||=. Se si desidera saltare oltre null e undefined allora si desidera ?=.

+2

Penso che tu intenda "# {v} .." non "# {a} ..", perché stampare due volte? –

+0

@NickSotiros: Penso che tu abbia ragione, le stringhe all'interno delle chiamate a 'console.log' dovrebbero (e ora lo fanno) usare' # {v} 'mentre il secondo argomento dovrebbe essere' a'. Grazie per il testa a testa. –