2013-03-26 12 views
10

Czytając dokumentację coffeescript, byłem zdezorientowany przez scant documentation on existential operators. Dokumentacja stwierdzawarunkowe egzystencjalne operatory przypisania w coffeescript

Może (?=) być również wykorzystywane do bezpieczniejszego cesji warunkowej niż ||= zapewnia, dla przypadków, w których może być obchodzenia liczb lub ciągów.

Jaka jest różnica między operatorem ?= i ||= i kiedy należy go użyć w porównaniu do innego?

Odpowiedz

18

? i || zwrotne zupełnie różne (ale zachodzące na siebie) warunkach.

Operator || działa dokładnie w ten sam sposób, jak ma to miejsce w JavaScript więc takie rzeczy jak 0 i '' są falsey miarę || dotyczy; || sprawdza prawdę w sensie JavaScript.

Operator ? przekształca się == null w JavaScript tak a ? b tylko b gdy a jest null lub undefined; ? sprawdza definicję w sensie CoffeeScript.

pod uwagę:

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) 

Pierwsza pętla daje pięć naleśniki i jeden 6, druga pętla da ci false, 0, '', dwa naleśniki i 6.

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

Więc jeśli tylko chcesz zachowanie JavaScript stylu (tzn 0, false i '' mają być ignorowane), a następnie prawdopodobnie chcesz ||=. Jeśli chcesz pominąć tylko null i undefined, a następnie chcesz ?=.

+2

Chyba masz na myśli "# {v} .." nie "# {a} ..", dlaczego wydrukować dwa razy? –

+0

@NickSotiros: Myślę, że masz rację, łańcuchy w wywołaniach 'console.log' powinny (i teraz robią) używać' # {v} ', podczas gdy drugi argument powinien być' a'. Dzięki za heads up. –