Enum flags in JavaScript

前端 未结 6 446
夕颜
夕颜 2021-01-30 08:23

I need to emulate enum type in Javascript and approach seems pretty straight forward:

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

N

6条回答
  •  [愿得一人]
    2021-01-30 09:09

    I've tried to create an example that demonstrates a common use case where one may want to use bit mask enums to control logging verbosity. It demonstrates the us of JavaScript bit-wise operations: 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");
    }
    

提交回复
热议问题