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

Spowoduje to utworzenie dwóch nowych vars (od else), jednak jeśli piszę go tak:ES6 rozpad, dynamiczne przydzielanie

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

Otrzymuję błąd składni. Jakie jest najlepsze podejście?

+0

Alternatywnie, 'const {text, value} = (typeof f === 'string') ? {text: f, value: f}: f; ' – loganfsmyth

Odpowiedz

7

Trzeba parens wokół Zadanie: (. Live copy on Babel)

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

Trzeba te parens z tego samego powodu you need parens or similar to immediately invoke a function: Aby powiedzieć parsera że powinien oczekiwać wyrażenia, a nie oświadczenie . Bez parens, gdy napotka {, uważa, że ​​to początek bloku. Ale w przeciwieństwie do funkcji, to musi być nawiasy, a nie prowadząc jednoskładnikowa +, ! itp 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

Nice one, thanks! – benhowdle89

+0

Dobra odpowiedź. Niewielka uwaga: nawiasy tylko muszą otaczać nawiasy klamrowe; samo zadanie może znajdować się na zewnątrz. – Zirak

+0

@Zirak: Nie, pareny muszą znajdować się wokół * całego * wyrażenia przypisania; jest to błąd w inny sposób: [bit.ly link do repliki Babel (za długi, aby wkleić komentarz)] (http://bit.ly/1HGPapN). Mają nawet konkretną wiadomość: "Próbujesz przypisać do wyrażenia nawiasowego, np. Zamiast' ({a}) = 0 "użyj' ({a} = 0) "A jeśli myślisz o nie jest to wcale zaskakujące: przy parensach tylko wokół '{}' wygląda on jak inicjator obiektu w parens (ponieważ w ES6 można użyć tej skróconej formy). –

Powiązane problemy