2009-10-26 6 views
33

Ich brauche Aufzählungstyp in Javascript zu emulieren und Ansatz scheint ziemlich geradlinig:Enum Flaggen in JavaScript

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

nun in C# ich diese Werte wie folgt kombinieren könnte:

MyEnum left_right = MyEnum.Left | MyEnum.Right 

und dann Ich kann testen, ob enum einen bestimmten Wert hat:

Kann ich sowas in Javascript machen?

+0

Beachten Sie, dass die Objektsyntax für MyEnum falsch ist. CMS hat in seiner Antwort bereits ein korrigiertes Beispiel angegeben. –

Antwort

39

In Javascript sollten Sie in der Lage sein, sie zu kombinieren, wie:

var left_right = MyEnum.Left | MyEnum.Right; 

Prüfung Dann würde genau das sein, wie es in Ihrem Beispiel von

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

Ja, arbeitet bitweise Arithmetik in Javascript. Sie müssen vorsichtig damit sein, weil Javascript nur den Number Datentyp hat, der als Gleitkommatyp implementiert ist. Die Werte werden jedoch in signierte 32-Bit-Werte für bitweise Operationen konvertiert. Solange du nicht versuchst, mehr als 31 Bits zu verwenden, geht es dir gut.

67

Sie müssen nur die bitwise Operatoren:

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

var myConfig = myEnum.left | myEnum.right; 

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

Weitere Informationen:

+4

Ich wünschte, ich könnte sowohl Mike Clark und Ihre Antworten markieren, aber ich kann nur einen und Mike hat viel weniger Punkte, so denke ich, dass Sie nicht verärgert sein werden, wenn ich seine Antwort markieren :) – Andrey

+2

@Andrey: Mach dir keine Sorgen !, Mikes Antwort ist auch vollständig gültig :-) – CMS

6

Ich habe versucht, ein Beispiel zu erstellen, die zeigt, ein häufiger Anwendungsfall whe Man könnte Bitmaskenaufzählungen verwenden wollen, um die Ausführlichkeit der Protokollierung zu steuern. Es zeigt die uns von JavaScript bitweise Operationen: 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"); 
}