javascript - ES6 destrukturering, dynamisk tilldelning


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

Att göra detta skapar två nya variabler (från else), men om jag skriver det så här:

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

Jag får ett syntaxfel. Vad är det bästa tillvägagångssättet här?

Svar #1

Du behöver parenteser runt tilldelningen:

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

(Live-kopia på Babel.)

Du behöver de där parenteserna av samma anledning som du behöver parenteser eller liknande för att omedelbart anropa en funktion: För att tala om för parsaren att den ska förvänta sig ett uttryck, inte ett uttalande. Utan parenteserna, när den stöter på {, tror den att det är början på ett block. Men till skillnad från med funktionen måste det vara parenteser, inte en ledande unär +, ! osv. som detta:

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