mdn - Banderas Enum en JavaScript
javascript enum (4)
Necesito emular el tipo enum en Javascript y el enfoque parece bastante sencillo:
var MyEnum = {Left = 1; Right = 2; Top = 4; Bottom = 8}
Ahora, en C # podría combinar esos valores de esta manera:
MyEnum left_right = MyEnum.Left | MyEnum.Right
y luego puedo probar si enum tiene cierto valor:
if (left_right & MyEnum.Left == MyEnum.Left) {...}
¿Puedo hacer algo así en Javascript?
En JavaScript, deberías poder combinarlos como:
var left_right = MyEnum.Left | MyEnum.Right;
Entonces la prueba sería exactamente como lo es en tu ejemplo de
if ( (left_right & MyEnum.Left) == MyEnum.Left) {...}
Intenté crear un ejemplo que demuestre un caso de uso común en el que uno quiera usar enums de máscara de bit para controlar la verbosidad de registro. Demuestra las operaciones de bits de JavaScript de nosotros: Véalo en JSFiddle
/*
* Demonstration of how a Flags enum can be simulated in JavaScript and
* Used to control what gets logged based on user passed value
*/
// A Flags Enum (sort-of)
var LogLevels = {
NONE: 0,
INFO: 1,
TRACE: 2,
DEBUG: 4,
WARN: 8,
ERROR: 16,
FATAL: 32
};
// Initialize
var currLogLevel = LogLevels.NONE;
// User Sets a log level
var logLevel = LogLevels.WARN;
// Convert the configured logLvel to a bit-masked enum value
switch (logLevel) {
case LogLevels.INFO:
currLogLevel = LogLevels.INFO | LogLevels.TRACE | LogLevels.DEBUG | LogLevels.WARN | LogLevels.ERROR | LogLevels.FATAL;
break;
case LogLevels.TRACE:
currLogLevel = LogLevels.TRACE | LogLevels.DEBUG | LogLevels.WARN | LogLevels.ERROR | LogLevels.FATAL;
break;
case LogLevels.DEBUG:
currLogLevel = LogLevels.DEBUG | LogLevels.WARN | LogLevels.ERROR | LogLevels.FATAL;
break;
case LogLevels.WARN:
currLogLevel = LogLevels.WARN | LogLevels.ERROR | LogLevels.FATAL;
break;
case LogLevels.ERROR:
case LogLevels.FATAL:
default:
currLogLevel = LogLevels.ERROR | LogLevels.FATAL;
}
// Example: log verbosity set to WARN, so this would NOT be logged
if ((currLogLevel & LogLevels.DEBUG) == LogLevels.DEBUG) {
console.log("log DEBUG");
}
Sí, la aritmética bit a bit funciona en Javascript. Debe tener cuidado con esto porque Javascript solo tiene el tipo de datos Number
, que se implementa como un tipo de coma flotante. Sin embargo, los valores se convierten a valores de 32 bits firmados para operaciones bit a bit. Así que mientras no intentes usar más de 31 bits, estarás bien.
Solo tienes que usar los operadores bitwise :
var myEnum = {
left: 1,
right: 2,
top: 4,
bottom: 8
}
var myConfig = myEnum.left | myEnum.right;
if (myConfig & myEnum.right) {
// right flag is set
}
Más información: