2009-10-26 34 views
33

tôi cần phải bắt chước kiểu enum trong Javascript và cách tiếp cận có vẻ khá thẳng về phía trước:cờ Enum trong JavaScript

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

Bây giờ, trong C# Tôi có thể kết hợp những giá trị như thế này:

MyEnum left_right = MyEnum.Left | MyEnum.Right 

và sau đó Tôi có thể kiểm tra nếu enum có giá trị nhất định:

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

Tôi có thể làm điều gì đó tương tự như vậy trong Javascript không?

+0

Lưu ý rằng cú pháp đối tượng là sai cho MyEnum. CMS đã cung cấp một ví dụ được sửa chữa trong câu trả lời của anh ấy. –

Trả lời

39

Trong javascript bạn sẽ có thể kết hợp chúng như:

var left_right = MyEnum.Left | MyEnum.Right; 

Sau đó, thử nghiệm sẽ hoàn toàn giống như là trong ví dụ của bạn của

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

Vâng, Bitwise số học làm việc trong Javascript. Bạn phải cẩn thận với nó vì Javascript chỉ có loại dữ liệu Number, được triển khai dưới dạng loại dấu phẩy động. Tuy nhiên, các giá trị được chuyển đổi thành đã ký giá trị 32 bit cho các hoạt động bitwise. Vì vậy, miễn là bạn không cố gắng sử dụng hơn 31 bit, bạn sẽ ổn thôi.

67

Bạn chỉ cần sử dụng bitwise nhà khai thác:

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

var myConfig = myEnum.left | myEnum.right; 

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

Thông tin thêm:

+4

Tôi ước tôi có thể đánh dấu cả Mike Clark và câu trả lời của bạn, nhưng tôi chỉ có thể làm một và Mike có ít điểm hơn, vì vậy tôi nghĩ bạn sẽ không buồn nếu tôi đánh dấu câu trả lời của mình :) – Andrey

+2

@Andrey: Đừng lo lắng !, Câu trả lời của Mike cũng hoàn toàn hợp lệ :-) – CMS

6

tôi đã cố gắng để tạo ra một ví dụ chứng minh một trường hợp sử dụng phổ biến whe người ta có thể muốn sử dụng bit enums mặt nạ để kiểm soát verbosity khai thác gỗ. Nó thể hiện cho chúng ta về JavaScript hoạt động chút khôn ngoan: 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"); 
} 
Các vấn đề liên quan