2017-08-29 1 views
3

Je tourne la tête pendant un petit moment, mais il semble que je n'arrive pas à faire ce travail comme je le voudrais. En fait, tout ce que je veux ici est d'avoir des valeurs par défaut imbriquées pour un argument optionnel. La sortie que je voudrais voir devrait être:Destructuration et réglage des valeurs par défaut imbriquées

55, 44, { sub1: '0', sub2: 55, sub3: 'all'} 

Au lieu de cela, je reçois ceci:

55, 44, { sub2: 55 } 

Quelqu'un pourrait-il me donner une tête sur celle-ci?

function foo({ param1=55, param2=44, param3:param3 = { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' } } = { }) { 
    console.log(param1, param2, param3); 
} 

foo({ 
    param3: { 
    sub2: 55 
    } 
}); 
+2

Est-ce pas la valeur par défaut ne s'appliquer si rien est passé dans ce paramètre? Je suis à peu près sûr que ça ne fonctionne pas comme 'Object.assign' –

+0

Si vous sautez simplement' param3', tout l'objet par défaut entre en jeu. Honnêtement, je ne sais pas si vous pouvez même aller pour des valeurs par défaut imbriquées comme ça, ne peut pas trouver beaucoup à ce sujet. – jAndy

Répondre

4

Vous passez {sub2: 55} pour param3, donc il ne sera pas évaluer la valeur par défaut { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' } (ce qui est un littéral ici, pas une cible d'affectation, donc ne serait pas faire ce que vous pensez qu'il fait de toute façon).

Si vous voulez param3 être toujours un objet avec 3 propriétés, construites à partir des trois variables par défaut à valeur, vous devez construire vous-même explicitement:

function foo({param1=55, param2=44, param3: {sub1='0', sub2=200, sub3='all'} = {}} = {}) { 
    var param3 = {sub1, sub2, sub3}; 
    console.log(param1, param2, param3); 
} 
+0

En d'autres termes, il n'existe aucun moyen de créer des valeurs par défaut pour les arguments déstructurés imbriqués? – jAndy

+0

@jAndy Je ne suis pas sûr de ce que vous voulez dire. Vous pouvez imbriquer arbitrairement la déstructuration d'argument et mettre des valeurs par défaut à chaque niveau. Ce que vous ne pouvez pas faire est d'avoir des arguments de mutation destructurants ou de créer de nouveaux objets dont les parties sont faites à partir de valeurs par défaut. – Bergi

+0

Donc, si vous passez 'param3' dans cet exemple, il remplacera toujours l'objet entier à droite? Le point que je me demande est, si vous pouvez encore créer des valeurs par défaut dans cet objet passé (c'est fondamentalement la même chose que sur l'extérieur, juste imbriqué). Mais il semble que vous avez déjà donné la réponse à cette question. J'aimerais avoir cette fonctionnalité de toute façon. – jAndy

0

paramètres par défaut sont-ils assignés uniquement si le paramètre est vide. Je pense que vous devez utiliser Object.assign dans le corps de la fonction:

const defaults = { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' } 
function foo({ param1=55, param2=44, param3 } = { }) { 
    const myParam3 = Object.assign({}, defaults, param3); 
    console.log(param1, param2, myParam3); 
} 

foo({ 
    param3: { 
    sub2: 55 
    } 
}); 
+0

Vous n'avez pas besoin de 'param3: param3 = defaults', juste' param3' suffirait. Ensuite, vous pouvez également intégrer les 'defaults' dans l'appel' Object.assign', et le fusionner avec le premier littéral d'objet. – Bergi