web-dev-qa-db-ja.com

JavaScriptの列挙型フラグ

私はJavaScriptで列挙型をエミュレートする必要があり、アプローチは非常に簡単です:

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

今、C#では、これらの値を次のように組み合わせることができます。

MyEnum left_right = MyEnum.Left | MyEnum.Right

次に、列挙型に特定の値があるかどうかをテストできます。

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

JavaScriptでそのようなことをすることはできますか?

45
Andrey

JavaScriptでは、それらを次のように組み合わせることができるはずです:

var left_right = MyEnum.Left | MyEnum.Right;

その後、テストはあなたの例とまったく同じになります

if ( (left_right & MyEnum.Left) == MyEnum.Left) {...}
48
Mike Clark

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
}

より詳しい情報:

76
CMS

はい、ビット演算はJavascriptで機能します。 JavascriptにはNumberデータ型しかなく、浮動小数点型として実装されているため、注意が必要です。ただし、値はビット単位の演算ではsigned 32ビット値に変換されます。したがって、31ビットを超えて使用しない限り、問題はありません。

10
Warren Young

ロギングの詳細度を制御するためにビットマスク列挙型を使用したい場合の一般的な使用例を示す例を作成しようとしました。これは、JavaScriptのビット単位の操作の使用を示しています。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");
}
5