2016-01-24 19 views
6

Stavo leggendo attraverso questa: https://github.com/pburtchaell/redux-promise-middleware/blob/master/src/index.jsCos'è ... !! sintassi in ES6?

so che ... viene utilizzato come oggetto di diffusione. So che lo !! viene utilizzato per convertire qualsiasi cosa in un booleano con la stessa veridicità.

Tuttavia sapendo questo cosa significano quando sono messi insieme come ...!!? Ho difficoltà a capire l'ultima riga qui:

{ 
    ...resolveAction, 
    ...isAction(rejected) ? rejected : { 
    ...!!rejected && { payload: rejected } 
} 
  1. ...resolveAction diffonde solo le chiavi del resolveAction.
  2. ...isAction(rejected) ? controllerà se rejected risolve un'azione e quindi la diffonderà. (Non sono sicuro di questo o)
  3. aggiungere rejected di opporsi se vero
  4. {...!!rejected && { payload: rejected } ????????????????

Come è ...!! anche la sintassi valida? Ci sono due opzioni:

  1. Se si diffonde l'oggetto, poi !! si applicherebbe a tutte le chiavi diffusione

  2. Se !! viene applicato un primo momento è un valore booleano e non può essere diffuso .

Così Fa alcun senso, o mi sto perdendo qualcosa, perché dato che il codice, suppongo che sta cercando di diffondere un valore booleano.

+0

In quel pronti contro termine, 'RESPINTO è un oggetto (linea 54). Forse l'operatore di spread in congiunzione con '!!' inverte ogni proprietà dell'oggetto? – Scott

+1

La mia ipotesi è, e questa è solo un'ipotesi poiché non ho trovato nulla nelle specifiche ES6 sulle precisioni, che '...' ha una precedenza bassa, quindi in realtà lo spread è applicato a 'respinto && {payload: reject} '. Quindi ciò che il codice sta effettivamente testando è che c'è un valore rifiutato e in tal caso passarlo come una chiave chiamata 'payload' – nbermudezs

+0

@nbermudezs Penso che tu stia facendo qualcosa. Un '&&' restituirà il secondo valore se il primo è vero, quindi l'oggetto si diffonde nell'oggetto padre. – L3viathan

risposta

3

Va bene così dopo aver scaricato il modulo NPM e passando attraverso il codice transpiled ho trovato la linea:

return dispatch(isThunk(rejected) ? rejected.bind(null, resolveAction) : _extends({}, resolveAction, isAction(rejected) ? rejected : _extends({}, !!rejected && { payload: rejected }))); 

la cui parte rilevante è qui:

_extends({}, !!rejected && { payload: rejected }) 

In pratica se !!rejected è vero allora diffonderà il carico utile nell'oggetto. Se non è _extends({}, false) restituisce semplicemente {}.

La chiave per questo funzionamento è che ... ha meno precedenza di qualsiasi altro operatore nell'intera linea. Con questo in mente puoi iniziare a dare un senso a questo.

+0

Non è nemmeno necessario d/l il codice treni. Basta usare babel repl sul loro sito. – aarosil

1

La questione rilevante è What is "x && foo()"?

La sintassi strana

{...!!rejected && { payload: rejected }} 

viene analizzato come

{ ... ((!!rejected) && { payload: rejected }) } 

Infatti il ​​!! non gettato rejected ad un valore booleano, allora viene valutata l'oggetto quando la verità.Un modo migliore per scrivere questo sarebbe

{ ...(rejected ? {payload: rejected} : null) } 

E naturalmente dell'intero oggetto interno letterale è superflua. Potrebbe essere solo

{ 
    ...resolveAction, 
    ...(isAction(rejected) ? rejected : (rejected ? {payload: rejected} : null)) 
} 

(omettere parentesi come meglio credi)

+0

Nel momento in cui ho chiesto questo, ho pensato sinceramente ... !! era una specie di operatore unico. Sapevo cosa intendeva &&, ma non sapevo quanto fosse bassa la precedenza di ... era la chiave per capirlo. Quindi, anche se questa risposta è giusta, manca il segno su quello che chiedevo effettivamente quale sarebbe "in quale ordine è (...) (!!) e (&&) valutato" – m0meni

+0

@ AR7: penso che "sia analizzato" come "il paragrafo spiega l'ordine di precedenza/valutazione, vero? – Bergi

+0

sì, sono d'accordo con te e ho detto "la risposta è giusta". L'unica parte che ho riscontrato è la prima frase. So cosa significa 'x && foo()'. Il caveat qui è che era "... !! x && foo()", che mi ha confuso. – m0meni