UPDATE
Merci pour tous les votes positifs, mais je ne pense pas que ma réponse ci-dessous soit la meilleure façon d'écrire des enums en JavaScript. Voir mon article de blog pour plus de détails : Enums en JavaScript .
L'alerte du nom est déjà possible :
if (currentColor == my.namespace.ColorEnum.RED) {
// alert name of currentColor (RED: 0)
var col = my.namespace.ColorEnum;
for (var name in col) {
if (col[name] == col.RED)
alert(name);
}
}
Vous pouvez également faire des valeurs des objets, afin d'avoir le beurre et l'argent du beurre :
var SIZE = {
SMALL : {value: 0, name: "Small", code: "S"},
MEDIUM: {value: 1, name: "Medium", code: "M"},
LARGE : {value: 2, name: "Large", code: "L"}
};
var currentSize = SIZE.MEDIUM;
if (currentSize == SIZE.MEDIUM) {
// this alerts: "1: Medium"
alert(currentSize.value + ": " + currentSize.name);
}
En JavaScript, comme il s'agit d'un langage dynamique, il est même possible d'ajouter ultérieurement des valeurs d'énumération à l'ensemble :
// Add EXTRALARGE size
SIZE.EXTRALARGE = {value: 3, name: "Extra Large", code: "XL"};
N'oubliez pas que les champs de l'enum (valeur, nom et code dans cet exemple) ne sont pas nécessaires au contrôle d'identité et ne sont là que par commodité. De même, le nom de la propriété size n'a pas besoin d'être codé en dur, mais peut être défini dynamiquement. Ainsi, si vous ne connaissez que le nom de la nouvelle valeur de votre enum, vous pouvez l'ajouter sans problème :
// Add 'Extra Large' size, only knowing it's name
var name = "Extra Large";
SIZE[name] = {value: -1, name: name, code: "?"};
Bien sûr, cela signifie que certaines hypothèses ne peuvent plus être faites (que la valeur représente l'ordre correct pour la taille par exemple).
Rappelez-vous, en JavaScript, un objet est comme un carte ou table de hachage . Un ensemble de paires nom-valeur. Vous pouvez les parcourir en boucle ou les manipuler d'une autre manière sans en savoir beaucoup à l'avance.
Exemple
for (var sz in SIZE) {
// sz will be the names of the objects in SIZE, so
// 'SMALL', 'MEDIUM', 'LARGE', 'EXTRALARGE'
var size = SIZE[sz]; // Get the object mapped to the name in sz
for (var prop in size) {
// Get all the properties of the size object, iterates over
// 'value', 'name' and 'code'. You can inspect everything this way.
}
}
À propos, si les espaces de noms vous intéressent, vous pouvez jeter un coup d'œil à ma solution pour une gestion simple mais puissante des espaces de noms et des dépendances pour JavaScript : Packages JS
174 votes
N'utilisez pas
0
comme un numéro d'énumération. Sauf s'il est utilisé pour quelque chose qui n'a pas été défini. JS traitefalse || undefined || null || 0 || "" || '' || NaN
tous de la même valeur lorsqu'on les compare en utilisant==
.209 votes
@matsko n'est-ce pas simplement un argument contre l'utilisation de == ?
8 votes
0 == null
renvoie à faux14 votes
Mais
false == 0
et+null == 0
(et les conversions en chiffres se produisent parfois quand on ne s'y attend pas), alors quenull == undefined
aussi, et+undefined
estNaN
(bien queNaN != NaN
).73 votes
La matrice de double égalité est plus déroutante que le formatage automatique de Microsoft Word.
2 votes
La méthode que vous avez mentionnée dans votre question est très utile pour NodeJS. Remplacer
my.namespace.ColorEnum =
avecmodule.export =
dans un fichier vide vous donne un enum dans son propre fichier NodeJS. Brillant.0 votes
Pourquoi le mot clé var n'est-il pas utilisé avant le nom de l'objet ?
2 votes
@greener L'OP montre comment il ajoute
ColorEnum
à la existant Objet "espace de nom".my.namespace
.2 votes
Vous pouvez même utiliser des symboles comme valeurs de vos clés pour garantir l'unicité, cf. stackoverflow.com/questions/38993711/
1 votes
@David Citron N'hésitez pas à changer la réponse acceptée en stackoverflow.com/a/5040502/3492994 qui est une meilleure façon de créer des enums en JavaScript.
0 votes
La façon dont vous définissez les constantes enum n'a pas vraiment d'importance. Le but principal des types enum est de s'assurer qu'une variable a un ensemble limité de valeurs autorisées, et les variables JS n'ont aucun moyen de le faire. Il existe sont syntaxes standard pour définir les types d'enum dans TypeScript et Flow, bien que ce soit différent de mettre vos constantes d'enum dans une sorte de structure que vous pouvez inspecter au moment de l'exécution.
0 votes
@aaaaaa @matsko la matrice de double égalité n'a pas vraiment d'importance si vous prenez l'habitude de toujours utiliser des triples égalités, avec la seule exception utile que
null == x
esttrue
si et seulement six
estnull
ouundefined
. Et si vous utilisez un linter qui signale une utilisation sommaire (/accidentelle) des doubles égalités.2 votes
Tu dis "+null == 0" comme si c'était un point pour utiliser le triple =, @aaaaaa ? Et bien... +null === 0, aussi bien...