2009-10-26 22 views
33

que necesitan para emular tipo de enumeración en Javascript y el enfoque parece bastante sencillo:banderas enumeración en JavaScript

var MyEnum = {Left = 1; Right = 2; Top = 4; Bottom = 8} 

Ahora, en C# podría combinar esos valores como esto:

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 como eso en Javascript?

+0

Tenga en cuenta que la sintaxis objeto es incorrecto para MyEnum. CMS ya proporcionó un ejemplo corregido en su respuesta. –

Respuesta

39

en JavaScript debe ser capaz de combinarlos como:

var left_right = MyEnum.Left | MyEnum.Right; 

luego las pruebas sería exactamente como lo es en el ejemplo de

if ((left_right & MyEnum.Left) == MyEnum.Left) {...} 
6

Sí, bit a bit aritmética 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 con valores de 32 bits para operaciones bit a bit. Así que mientras no intentes usar más de 31 bits, estarás bien.

67

sólo hay que utilizar 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:

+4

Desearía poder marcar tanto Mike Clark como sus respuestas, pero solo puedo hacer una y Mike tiene muchos menos puntos, así que creo que no se molestará si marcó su respuesta :) – Andrey

+2

@Andrey: No se preocupe !, La respuesta de Mike también es completamente válida :-) – CMS

6

He tratado de crear un ejemplo que demuestra un caso de uso común cuando re uno puede desear utilizar enumeraciones de máscara de bit para controlar la verbosidad de registro. Demuestra a Estados Unidos de JavaScript operaciones bit a bit: See it on 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"); 
}