2009-10-26 17 views
33

muszę naśladować typu enum w JavaScript i podejście wydaje się dość prosta:Enum flagi w JavaScripcie

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

Teraz w C# mogłem połączyć te wartości tak:

MyEnum left_right = MyEnum.Left | MyEnum.Right 

a następnie Mogę sprawdzić, czy enum ma pewną wartość:

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

Czy mogę zrobić coś takiego w JavaScript?

+0

Zauważ, że składnia obiekt jest niewłaściwe dla MyEnum. CMS już dostarczył poprawiony przykład w swojej odpowiedzi. –

Odpowiedz

39

W javascript powinieneś być w stanie połączyć je jako:

var left_right = MyEnum.Left | MyEnum.Right; 

Następnie badanie byłoby dokładnie tak, jak to jest w przykładzie

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

Tak, bitwise arytmetyka pracuje w JavaScript. Musisz być ostrożny, ponieważ JavaScript ma tylko typ danych Number, który jest implementowany jako typ zmiennoprzecinkowy. Ale wartości są konwertowane na podpisane 32-bitowe wartości dla operacji bitowych. Dopóki nie spróbujesz użyć więcej niż 31 bitów, wszystko będzie dobrze.

67

Po prostu trzeba użyć bitwise operatory:

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

var myConfig = myEnum.left | myEnum.right; 

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

Więcej informacji:

+4

Chciałbym móc zaznaczyć zarówno Mike'a Clarka, jak i twoje odpowiedzi, ale mogę zrobić tylko jeden, a Mike ma o wiele mniej punktów, więc myślę, że nie będziesz zdenerwowany, gdy zaznaczę jego odpowiedź :) – Andrey

+2

@Andrey: Nie martw się. !, Odpowiedź Mike'a jest również całkowicie poprawna :-) – CMS

6

Próbowałem utworzyć przykład ilustrujący powszechny przypadek użycia, whe re można chcieć użyć wyrażeń mas bitowych do kontrolowania szczegółowości rejestrowania. pokazuje on nam operacje JavaScript bitową: 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"); 
}