?
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 ?=
.
Chyba masz na myśli "# {v} .." nie "# {a} ..", dlaczego wydrukować dwa razy? –
@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. –