TODO: What is the problem? Why can’t variables or objects do it? TODO: It’s not necessarily about comparing: If you get a parameter, how can you be sure that a value comes from an enum symbol and not from a random string? Enums just give you a little more safety with regard to legal values. Lastly, custom properties (including methods) for an enum symbol do help with many tasks. And you cannot have those on strings. TODO: Internalized strings for fast comparison. This post describes a JavaScript implementation of enums, enumerations of symbols. The idea originally comes from Allen Wirfs-Brock, via a thread on the es-discuss mailing list.
var color = new enums.Enum("red", "green", "blue"); function isGreen(c) { return c === color.green; }color.green is an object (an instance of Symbol) and a === b is only true if a and b are the same object, so the above works out nicely. Interaction:
> isGreen(color.red) false > isGreen(color.green) trueThe cool thing is that switch works, too:
function translate(c) { switch(c) { case color.red: return "rot"; case color.green: return "grün"; case color.blue: return "blau"; } }Interaction:
> translate(color.red) 'rot'You can also give enum symbols custom properties:
var color = new enums.Enum({ red: { de: "rot" }, green: { de: "grün" }, blue: { de: "blau" }, });Then translate() becomes simpler:
function translate(c) { return c.de; }Lastly, enum symbols can also be converted to string:
> console.log("The sky is "+color.blue); The sky is |blue| > console.log("The sky is "+color.blue.name); The sky is blueIsn’t there an easier way? You might think that the following is simpler than an enum:
var color2 = { red: "red", green: "green", blue: "blue", }However, it is a problem of type safety: Enum symbols are not equal to anything but themselves. The properties of color2 do not exhibit this behavior:
> color2.red === "red" true > color.red === "red" false