Me preguntaba cómo mecanografiado compilaría una enumeración en un código javascript. Así que implementé el siguiente ejemplo:
enum Contagens { UM, DOIS, TRES }
Y fue compilado en esto:
"use strict"; var Contagens; (function (Contagens) { Contagens[Contagens["UM"] = 0] = "UM"; Contagens[Contagens["DOIS"] = 1] = "DOIS"; Contagens[Contagens["TRES"] = 2] = "TRES"; })(Contagens || (Contagens = {}));
Pero, no entiendo cómo funciona... ¿alguien podría explicarme este código?
La variable var Contagens;
Esto crea la variable que contendrá una referencia a la enumeración.
El argumento Contagens || (Contagens = {})
la enumeración se usa si ya existe, y se establecerá en un objeto vacío, si no existe. Esto permite que las enumeraciones se extiendan:
enum Contagens { UM, DOIS, TRES } enum Contagens { CATRE = 4 }
La función function (Contagens) {
toma un argumento Contagens
que es el valor del paso #2. En esta función, creará las entradas en el objeto enumerado. Tiene el mismo nombre que la variable exterior Contagens
, por lo que sombrea esa variable. Pero es el mismo valor, así que eso no importa mucho.
La asignación.
Contagens[Contagens["UM"] = 0] = "UM";
El resultado de una asignación es el valor que se asigna.* Entonces Contagens["UM"] = 0
hace dos cosas. Establece la clave "UM"
en el valor 0
y devuelve 0
.
Ese 0
devuelto se usa luego en una segunda asignación:
Contagens[0] = "UM";
Ahora a la propiedad "UM"
se le ha asignado 0
y la propiedad 0
se ha asignado a "UM"
. La enumeración ahora se ve así:
{ UM: 0, "0": "UM" }
Esto le permite buscar un valor en una enumeración por su nombre u obtener su nombre de su valor.
Contagens.UM // 0 Contagens[0] // "UM"
¡Qué es útil!
* El resultado de una asignación al declarar una variable no está undefined
, pero asignar una propiedad de un objeto o asignar a una variable existente devolverá el valor asignado. JS es así de peculiar.