【问题标题】:Create enum in java script在javascript中创建枚举
【发布时间】:2015-02-02 16:08:15
【问题描述】:

我想在 javascript 中创建枚举,我做了以下代码,我想验证这是正确的方法。

    var dataStates = {
    withMock: "withM",
    withoutMock: "withoutM",
};

还好吗?

例如,我想像这样使用它

oCation.dataMode === dataStates.withMock

那个 state.data.withMock 将保存该值,但我不确定这是否是正确的方式......

【问题讨论】:

  • 在 JS 中有很多方法可以做这样的事情——这真的取决于你所说的“枚举”是什么意思。这只是一个对象;它工作然后它是“正确的”,但需要注意的是没有什么可以阻止错误的代码重新分配一个值。

标签: javascript enums


【解决方案1】:

您创建的是具有命名属性的对象。这不是 Java 意义上的枚举。也就是说,没有强制唯一性和单一实例的语言限制。但是,您所做的将满足您在问题中指定的要求。

【讨论】:

    【解决方案2】:

    Javascript 没有正确的(静态)enum 类型,但您可以使用 Typescript 为其枚举生成的相同代码实现非常接近的目标。

    要提供枚举但仍然是有效的 JS,您需要一个对象,其中每个枚举元素(名称)都是一个键,映射到一个唯一值(通常是一个 int,因为大多数具有枚举的语言都以整数值支持它们)。

    对于像enum Color {Red, Green, Blue}; 这样的枚举,您最终会得到包含以下内容的代码:

    Color[Color["Red"] = 0] = "Red";
    Color[Color["Green"] = 1] = "Green";
    Color[Color["Blue"] = 2] = "Blue";
    

    这将创建一个对象,其中每个枚举元素的名称和每个元素的值都有一个键。最终对象如下所示:

    var Color;
    
    (function(Color) {
      Color[Color["Red"] = 0] = "Red";
      Color[Color["Green"] = 1] = "Green";
      Color[Color["Blue"] = 2] = "Blue";
    })(Color || (Color = {}));
    
    document.getElementById("result").textContent = JSON.stringify(Color);
    <pre id="result"></pre>

    这允许您使用传统的 Color.Red 语法访问枚举值,但也允许您使用 Color[Color.Red](或包含枚举值之一的变量)将值映射回名称。

    例如:

    var Color;
    
    (function(Color) {
      Color[Color["Red"] = 0] = "Red";
      Color[Color["Green"] = 1] = "Green";
      Color[Color["Blue"] = 2] = "Blue";
    })(Color || (Color = {}));
    
    document.getElementById("red").textContent = Color.Red; // Should print "0"
    
    var currentColor = Color.Green;
    document.getElementById("green").textContent = Color[currentColor]; // Should print "Green"
    
    currentColor = Color.Blue;
    document.getElementById("blue").textContent = Color[currentColor]; // Should now print "Blue"
    <pre id="red"></pre>
    <pre id="green"></pre>
    <pre id="blue"></pre>

    【讨论】:

    • 对这样的对象有什么好处:var Color = { Red : 0, Green : 1, Blue : 2 };
    • @bhspencer 那只允许您使用Color.Red === 0 并获取值,而不是Color[Color.Red] === "Red" 并从值中获取名称。
    • 我明白了,如果您只知道 int 索引,它可以让您获取字符串名称。谢谢。
    • 请考虑不要使用整数作为您使用字符串的值。例如var Color = { 红色:“红色”,绿色:“绿色”,蓝色:“蓝色”};现在您可以进行比较,并以看起来更简单的方式命名。
    • @bhspencer 不,这打破了关于枚举应该如何表现的相对基本的期望。使用枚举作为代表(通常是连续的)整数值的名称相当普遍。
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多