在JavaScript中定义枚举的首选语法是什么?

在JavaScript中定义枚举的首选语法是什么? 就像是:

my.namespace.ColorEnum = {
    RED : 0,
    GREEN : 1,
    BLUE : 2
}

// later on

if(currentColor == my.namespace.ColorEnum.RED) {
   // whatever
}

还是有更好的成语?


由于1.8.5可以密封和冻结物体,因此将上述定义为:

var DaysEnum = Object.freeze({"monday":1, "tuesday":2, "wednesday":3, ...})

要么

var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}
Object.freeze(DaysEnum)

瞧! JS枚举。

资源

行情是不需要的,但我保持一致。


这不是一个很好的答案,但我可以说个人的工作很好

话虽如此,因为它的值并不重要(你已经使用了0,1,2),所以如果你想输出当前值,我会使用一个有意义的字符串。


更新 :感谢所有大家的赞扬,但我不认为我的答案在下面是用Javascript编写枚举的最佳方式。 查看我的博客文章以获取更多详细信息:使用Javascript枚举。


提醒名称已经可以了:

if (currentColor == my.namespace.ColorEnum.RED) {
   // alert name of currentColor (RED: 0)
   var col = my.namespace.ColorEnum;
   for (var name in col) {
     if (col[name] == col.RED)
       alert(name);
   }
}

或者,您可以制作值对象,以便您可以拥有蛋糕并将其吃掉:

var SIZE = {
  SMALL : {value: 0, name: "Small", code: "S"}, 
  MEDIUM: {value: 1, name: "Medium", code: "M"}, 
  LARGE : {value: 2, name: "Large", code: "L"}
};

var currentSize = SIZE.MEDIUM;
if (currentSize == SIZE.MEDIUM) {
  // this alerts: "1: Medium"
  alert(currentSize.value + ": " + currentSize.name);
}

在Javascript中,因为它是一种动态语言,所以以后甚至可以将枚举值添加到集合中:

// Add EXTRALARGE size
SIZE.EXTRALARGE = {value: 3, name: "Extra Large", code: "XL"};

请记住,身份检查不需要枚举的字段(值,名称和代码),只是为了方便。 此外,size属性本身的名称不需要进行硬编码,但也可以动态设置。 所以假设你只知道新的枚举值的名字,你仍然可以毫无问题地添加它:

// Add 'Extra Large' size, only knowing it's name
var name = "Extra Large";
SIZE[name] = {value: -1, name: name, code: "?"};

当然,这意味着一些假设不能再被做出(例如,该值代表正确的大小顺序)。

请记住,在Javascript中,对象就像地图或散列表。 一组名称 - 值对。 您可以循环浏览它们或以其他方式操作它们,而不必事先了解它们。

例如:

for (var sz in SIZE) {
  // sz will be the names of the objects in SIZE, so
  // 'SMALL', 'MEDIUM', 'LARGE', 'EXTRALARGE'
  var size = SIZE[sz]; // Get the object mapped to the name in sz
  for (var prop in size) {
    // Get all the properties of the size object, iterates over
    // 'value', 'name' and 'code'. You can inspect everything this way.        
  }
} 

顺便说一句,如果你对命名空间感兴趣,你可能想看看我的解决方案,为JavaScript提供简单而强大的命名空间和依赖管理:Packages JS

链接地址: http://www.djcxy.com/p/2667.html

上一篇: What is the preferred syntax for defining enums in JavaScript?

下一篇: How can I represent an 'Enum' in Python?