2016-06-24 19 views
14

Recentemente sono passato a es6 e ho iniziato a utilizzare le funzioni di freccia su tutto il mio codice. Mentre refactoring mi sono imbattuto sottostante CodiceCome restituire oggetto anonimo da una funzione di freccia di linea in javascript?

data.map(function(d) { 
    return {id: d.id, selected: bool}; 
}); 

ho cambiato sopra il codice per questo -

data.map((d) => {id: d.id, selected: bool}); 

Ma mi stavo errore dall'alto codice. Non so cosa c'è di sbagliato qui? So che se non vi è alcun blocco di codice, vi è un ritorno implicito fornito dalla funzione freccia.

Ma non si sa come restituire oggetto vuoto o oggetto anonimo con alcune proprietà inizializzate?

Edit:

Cosa c'è di sbagliato se lo faccio in questo modo? Solo per curiosità.

data.map((d) => new {id: d.id, selected: bool}); 
+2

Ecco una lettura leggermente correlata interessante che ho trovato durante lo studio di questo argomento https://rainsoft.io/when-not-to-use-arrow-functions-in-javascript/ (in particolare i punti 2 e 4) – cregox

risposta

27

Put parentesi contenute intorno al inizializzatore di oggetto:

data.map((d) => ({id: d.id, selected: bool})); 

parentesi hanno alcun effetto sul valore dell'espressione loro interno, ma fare hanno l'effetto sintattica di eliminare l'ambiguità della prima gettone dell'espressione contenuta. Senza le parentesi, il parser JavaScript deve decidere se il token { significa "Qui inizia un corpo di funzione" o "Qui viene avviato un inizializzatore dell'oggetto". Lo sempre sceglie il primo (ovvero un blocco di codice).

Introducendo il parentesi, pertanto, elimina la confusione: l'unica cosa che uno dei principali ( può significare sia "qui arriva espressione", in modo che {all'interno le parentesi possono essere "qui arriva un inizializzatore oggetto." (Non è possibile rilasciare un blocco di codice nel mezzo di un'espressione, in altre parole; se ci provi, si verificherà un errore di sintassi.)

+2

Will you please spiegare anche la parte modificata? – WitVault

+1

@WitVault è sbagliato usare 'new' perché' new' funziona solo quando ciò che viene dopo è un riferimento a una funzione. Se ci provassi, avresti anche un errore. – Pointy

+1

Hai ragione ho ricevuto l'errore. Ma volevo solo capire cosa stia succedendo. – WitVault

0

È inoltre possibile utilizzare

data.map((d) => { 
    return {id: d.id, selected: bool} 
}); 
Problemi correlati