2009-10-26 16 views
33

ho bisogno di emulare tipo enum in Javascript e l'approccio sembra piuttosto semplice:Enum bandiere in JavaScript

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

Ora, in C# ho potuto combinare questi valori come questo:

MyEnum left_right = MyEnum.Left | MyEnum.Right 

e poi Posso verificare se enum ha un certo valore:

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

Posso fare qualcosa del genere in Javascript?

+0

Si noti che la sintassi oggetto è sbagliato per MyEnum. CMS ha già fornito un esempio corretto nella sua risposta. –

risposta

39

in javascript si dovrebbe essere in grado di combinare loro come:

var left_right = MyEnum.Left | MyEnum.Right; 

poi prova sarebbe esattamente come è nel tuo esempio di

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

Sì, bit per bit aritmetica lavora in Javascript. Devi fare attenzione perché Javascript ha solo il tipo di dati Number, che viene implementato come un tipo a virgola mobile. Tuttavia, i valori vengono convertiti in con firma valori a 32 bit per operazioni bit a bit. Quindi, finché non provi a usare più di 31 bit, starai bene.

67

Non vi resta che utilizzare i bitwise operatori:

var myEnum = { 
    left: 1, 
    right: 2, 
    top: 4, 
    bottom: 8 
} 

var myConfig = myEnum.left | myEnum.right; 

if (myConfig & myEnum.right) { 
    // right flag is set 
} 

Maggiori informazioni:

+4

Vorrei poter contrassegnare sia Mike Clark che le tue risposte, ma posso fare solo uno e Mike ha molti meno punti, quindi penso che non sarai turbato se segnerò la sua risposta :) – Andrey

+2

@Andrey: Non preoccuparti !, La risposta di Mike è anche completamente valida :-) – CMS

6

Ho cercato di creare un esempio che dimostra un caso di uso comune whe si potrebbe voler usare l'enumerazione delle maschere di bit per controllare la verbosità di registrazione. Dimostra le operazioni bit-saggio noi di JavaScript: 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"); 
}