Peu de mots-clés portent deux sens aussi éloignés. Dans un switch, default ramasse tout ce qu'aucun cas n'a prévu. Dans un module, il désigne la chose principale que le fichier publie.
Les deux emplois n'ont aucun rapport technique, mais ils partagent la même idée : ce qui s'applique quand rien de plus précis n'a été demandé. Les distinguer évite une bonne partie des malentendus autour de ce mot.
Définition
default est un mot réservé du langage. Il introduit le bloc d'un switch exécuté lorsqu'aucun case ne correspond, ou marque l'export principal d'un fichier avec export.
Étant réservé, il ne peut pas servir de nom de variable. Il reste en revanche parfaitement valable comme nom de propriété, ce que vous rencontrez dès qu'un module est chargé dynamiquement : la valeur exportée par défaut s'y lit dans outils.default.
Le cas restant d'un switch
Sans default, un switch qui ne trouve aucune correspondance ne fait simplement rien, et cette absence de réaction est une source classique de bug silencieux.
function acces(role) {
switch (role) {
case 'admin':
return 'Accès complet';
case 'membre':
return 'Accès limité';
default:
return 'Aucun accès';
}
}
acces('admin'); // 'Accès complet'
acces('visiteur'); // 'Aucun accès'Une valeur inattendue est ainsi traitée explicitement, au lieu de laisser la fonction renvoyer undefined.
default n'est pas obligé d'être écrit en dernier, et ce détail réserve une surprise : s'il ne se termine pas par un break ou un return, l'exécution continue dans le case qui le suit, exactement comme entre deux cas. Le placer à la fin évite d'y penser.
L'export principal d'un module
Un fichier peut désigner une valeur comme son export par défaut. Celui qui l'importe choisit alors librement le nom qu'il lui donne.
// bouton.js
export default function Bouton(libelle) {
return '[' + libelle + ']';
}
// page.js
import Bouton from './bouton.js'; // sans accolades
import MonBouton from './bouton.js'; // le nom est libreDeux règles encadrent cet usage. Un fichier ne peut avoir qu'un seul export par défaut, alors que les exports nommés sont illimités. Et l'absence d'accolades côté import n'est pas une coquetterie : c'est elle qui distingue les deux demandes.
| Export | Import correspondant |
|---|---|
export default x | import x from '...' |
export const x = 1 | import { x } from '...' |
Questions fréquentes
Un paramètre par défaut utilise-t-il ce mot-clé ?
Non, et la confusion est fréquente. Écrire function saluer(nom = 'invité') définit bien une valeur par défaut, mais avec un simple signe égal, sans le mot default. Les deux notions portent le même nom en français et n'ont aucun rapport dans le code.
Faut-il toujours mettre un default dans un switch ?
C'est une bonne habitude dès que la valeur testée peut venir de l'extérieur, d'un formulaire ou d'une réponse d'API par exemple. Quand les cas possibles sont connus et fermés, certains préfèrent s'en passer pour qu'un outil d'analyse signale le jour où un cas nouveau apparaît. Dans le doute, écrivez-le et faites-y remonter l'anomalie.
Peut-on avoir deux exports par défaut dans un fichier ?
Non, le fichier refuse de se charger. Si deux valeurs méritent d'être mises en avant, elles doivent devenir des exports nommés, quitte à en promouvoir une seule en export par défaut. C'est souvent le signe que le fichier fait deux choses et gagnerait à être coupé en deux.