2015-06-14 7 views
6
let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    let { 
     text, value 
    } = f; 
} 

In questo modo si crea due nuovi Vars (dal else), se scrivo in questo modo:ES6 destrutturazione, assegnazione dinamica

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    { 
     text, value 
    } = f; 
} 

ricevo un errore di sintassi. Qual è l'approccio migliore qui?

+0

In alternativa, 'const {text, valore} = (typeof f === 'stringa') ? {text: f, value: f}: f; ' – loganfsmyth

risposta

7

È necessario parentesi intorno alla assegnazione: (. Live copy on Babel)

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    ({    // (at start 
     text, value 
    } = f);   //) at end 
} 

avete bisogno di quelle parentesi per lo stesso motivo you need parens or similar to immediately invoke a function: A dire il parser che dovrebbe aspettarsi un'espressione, non una dichiarazione . Senza i parens, quando incontra il {, pensa che sia l'inizio di un blocco. Ma a differenza con la funzione, deve essere parentesi, non un leader unario +, !, ecc like this:

let text, value; 
if (typeof f == 'string') { 
    text = value = f; 
} else { 
    +{     // <== Doesn't work like it does with IIFEs 
     text, value 
    } = f; 
} 
+1

Bello, grazie! – benhowdle89

+0

Buona risposta. Nota secondaria: le parentesi devono solo circondare le parentesi graffe; il compito stesso può essere esterno. – Zirak

+0

@Zirak: No, i parenti devono essere intorno alla * intera * espressione di assegnazione; è un errore altrimenti: [link bit.ly a Babel repl (troppo lungo per incollare un commento)] (http://bit.ly/1HGPapN). Hanno anche un messaggio specifico per questo: "Stai cercando di assegnare a un'espressione parentesi, ad esempio invece di' ({a}) = 0' usa '({a} = 0)' "E se pensi a non è affatto sorprendente: con il paren attorno a '{}', sembra un inizializzatore di oggetti in parens (perché in ES6 puoi usare quella forma abbreviata). –

Problemi correlati