Contexte
Quand j'ai essayé de déstructurer l'affectation avec des tableaux, j'ai pu pré-déclarer mes variables:
let a, b, c;
let arr = [1, 2, 3, 4, 5];
[a, b, c] = arr;
console.log(a) // logs 1
console.log(b) // logs 2
console.log(c) // logs 3
Cela est passé très bien par le compilateur Babel.
Mais quand j'ai essayé de faire la même chose avec des objets, j'ai eu une erreur
let a, b, c
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'};
{cat: a, dog: b, mouse: c} = obj;
console.log(a) // I want this to log 'meow'
console.log(b) // I want this to log 'woof'
console.log(c) // I want this to log 'squeak'
Question
Est-ce un problème/problème ES6 ou Babel? Si c'est intentionnel pour ES6, pourquoi la différence avec la façon dont les tableaux sont traités?
Remarque
Je comprends que le remplacement de var
par let
signifie que je ne suis pas obligé de pré-déclarer mes variables et que le fait d'avoir let
en ligne est valide (et, je crois, généralement préféré ). J'aimerais connaître la différence entre les implémentations plutôt qu'une réponse "ne faites pas ça du tout".
Lorsque vous déstructurez un objet,
vous devez utiliser les mêmes noms de variables que les clés de l'objet. Ce n'est qu'alors que vous obtiendrez une correspondance un à un et que les valeurs seront correctement déstructurées.
et vous devez encapsuler l'intégralité de l'affectation entre parenthèses si vous n'utilisez pas de déclaration, sinon le littéral d'objet dans l'expression de gauche serait considéré comme un bloc et vous obtiendrez une erreur de syntaxe.
Donc, votre code fixe ressemblerait à ceci
'use strict';
let cat, dog, mouse;
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'};
({cat, dog, mouse} = obj); // Note the `()` around
ce qui équivaut à
'use strict';
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'};
let {cat, dog, mouse} = obj;