HOWTO · JavaScript

Énumérateur en JavaScript

Dans l'article d'aujourd'hui, nous allons en apprendre davantage sur l'énumérateur en JavaScript.

Sur cette page

JavaScript ne possède pas de type Enum traditionnel intégré. En JavaScript natif, vous pouvez utiliser un tableau ordonné lorsque la position compte, ou créer un objet qui associe des noms à des valeurs numériques. Pour rechercher une valeur dans un tableau, indexOf(searchElement) cherche une correspondance. TypeScript fournit bien une syntaxe pour les énumérations, mais ces approches en JavaScript reposent sur des tableaux et des objets ordinaires, dont le comportement diffère.

Ce que représente une énumération en JavaScript

Une énumération associe des noms significatifs à un ensemble fixe de valeurs apparentées. En JavaScript, ni un tableau ni un objet n’obéit automatiquement aux règles d’une énumération : chacun reste une valeur ordinaire et modifiable. Choisissez une représentation en fonction de la manière dont votre code doit accéder aux valeurs. Un tableau convient lorsque l’ordre compte ou que vous devez trouver la position d’une valeur. Un objet convient lorsque vous connaissez déjà un nom et souhaitez obtenir le nombre qui lui est associé.

Utiliser un tableau lorsque vous avez besoin de valeurs ordonnées et d’une recherche

Un tableau conserve l’ordre dans lequel ses valeurs sont écrites. Sa méthode indexOf renvoie la position de la première correspondance, ou -1 si aucune n’est trouvée. La comparaison utilise l’égalité stricte : des valeurs de types différents ne correspondent donc pas. Si une même valeur apparaît plusieurs fois, la méthode renvoie la position de sa première occurrence.

L’argument facultatif fromIndex définit le point de départ de la recherche. Une valeur non négative indique la position de départ ; une valeur négative compte à rebours depuis la fin du tableau. Si le point de départ obtenu se situe après le dernier élément, la recherche ne trouve rien. Si une valeur négative le place avant le début du tableau, la recherche commence au premier élément. Pour en savoir plus, consultez la référence de indexOf.

Exécutez cet exemple. Le code et les libellés ou résultats qu’il affiche restent en anglais :

const operatingSystems = ['Linux', 'macOS', 'Windows', 'Ubuntu'];
console.log(operatingSystems.indexOf('Linux'));

Le nombre renvoyé est la position, à partir de zéro, de la première valeur correspondante. Lors d’une recherche, vérifiez que le résultat n’est pas -1 avant de l’utiliser comme une position valide. Un tableau est également modifiable : .push() peut ajouter une valeur, tandis que .map() crée un nouveau tableau à partir de valeurs transformées. Ces opérations ne transforment pas le tableau en énumération et ne garantissent pas un ensemble de valeurs fixe. L’inventaire fourni ne comportait pas de destinations françaises pour ces liens ; leurs cibles anglaises sont donc conservées.

Créer un objet semblable à une énumération avec une boucle

Si le code appelant doit retrouver un nombre à partir d’un nom, une boucle peut créer un objet dont les propriétés portent les noms transmis en arguments et dont les valeurs correspondent à leurs positions. Cette fonction utilise arguments, la collection locale à la fonction qui contient les arguments transmis à une fonction traditionnelle. Enum est ici un nom de fonction défini par l’utilisateur, et non un mot-clé JavaScript ou un type intégré. Le code et les libellés ou résultats affichés restent en anglais.

function Enum() {
  const values = {};
  for (let i = 0; i < arguments.length; i++) {
    values[arguments[i]] = i;
  }
  return values;
}

const operatingSystem = Enum('Linux', 'macOS', 'Windows', 'Ubuntu');
console.log(operatingSystem.Linux);

La propriété Linux est associée à 0, car il s’agit du premier argument. Cette version renvoie un objet ordinaire, qui peut donc être utilisé directement sans new. Si un nom d’argument apparaît plusieurs fois, une affectation ultérieure remplace la valeur précédente de cette propriété. Comme cet objet hérite de Object.prototype, cette approche simple convient surtout à une liste maîtrisée de noms courants. Si les noms peuvent provenir d’une entrée non fiable ou arbitraire, utilisez plutôt un objet sans prototype ou une Map. L’association ne fonctionne que dans un sens : elle ne crée pas de recherche inverse d’un nombre vers son nom et ne valide pas les valeurs affectées ailleurs dans le programme.

Choisir une approche et en comprendre les limites

Utilisez un tableau si l’ordre compte ou si vous devez rechercher des valeurs avec indexOf. Utilisez un objet associant les noms aux nombres lorsque votre entrée est un nom connu et qu’un accès direct à une propriété est plus clair qu’une recherche dans un tableau. Dans les deux cas, JavaScript ne garantit pas que la collection restera fixe, n’empêche pas les valeurs inconnues et ne garantit pas la stabilité des positions numériques si vous réordonnez les entrées.

Pour un petit ensemble de constantes, regroupez les valeurs et, par convention, évitez de les modifier après leur initialisation. Si votre code dépend de valeurs numériques persistées, de formats réseau ou de valeurs partagées entre plusieurs programmes, attribuez-leur des nombres explicites et considérez-les comme faisant partie de cette interface ; des nombres calculés à partir des positions d’un tableau peuvent changer de sens sans avertissement après un réordonnancement. Les énumérations TypeScript offrent une syntaxe d’énumération à la compilation, mais elles relèvent de TypeScript et ont leur propre comportement dans le JavaScript généré. Choisissez-les si le système de types TypeScript fait partie de votre projet, plutôt que de supposer que les tableaux ou les objets natifs de JavaScript fournissent les mêmes vérifications.