Javascript ENUM 模式命名约定

问题描述 投票:0回答:4

我正在开发一个 javascript 项目,该项目需要使用 javascript“Enums”,意思是像这样的对象:

var WinnerEnum = {
    Player1: 1,
    Player2: 2,
    Draw: 0
};

这对我来说非常有用,但是,我不知道命名枚举的正确方法(根据惯例)是什么,因为据我所知,只有类名以大写字母开头(表示调用构造函数的能力)开)。

JSHint 还输出以下警告:

Missing 'new' prefix when invoking a constructor.

如果没有约定,我希望有一种命名枚举的好方法,不会将它们与类名混淆。 2014 年更新:JSHint 不再这样做。

javascript naming-conventions jshint
4个回答
61
投票

这确实是命名枚举的正确方法,但枚举值应该是 ALL_CAPS 而不是 UpperCamelCase,如下所示:

var WinnerEnum = {
    PLAYER_1: 1,
    PLAYER_2: 2,
    DRAW: 0
};

这类似于 Java 的枚举命名约定

一些参考:

与一般的编码风格一样,您会发现人们以多种不同的方式做事,每种方式都有其自己的一套充分的理由。然而,为了让任何人都能更轻松地阅读和使用您的代码,我建议使用具有最权威参考文献的样式,因此通常是最广泛采用的样式。

我找不到比 Google 的风格指南和上面的著作更权威的参考文献,这些文章是由认真思考过枚举的人撰写的,但我很想听听任何更好的参考文献。


13
投票

根据 Google 的编码约定,这确实是在 javascript 中命名枚举的正确方法。

根据要求这是一个链接


2
投票

首先,在 JS 中没有声明伪枚举的“正确”方法*。如果可能的话,您应该努力在现有代码库和/或组织的约定中保持一致。

一个流行的约定是Google JavaScript 样式指南。例如:

const TemperatureScale = {
  CELSIUS: 'celsius',
  FAHRENHEIT: 'fahrenheit',
};


奇怪的是,这与 MDN 的 const

隐藏约定
不一致,如 Google 的示例中,
TemperatureScale
const
TemperatureScale.CELSIUS
不是!

* 它必须是有效的 JavaScript 标识符。


0
投票

命名方面,这取决于您使用的是 TypeScript 还是普通 JavaScript。 Google 有 JavaScript 样式指南,但已弃用它,转而使用 TypeScript。

假设普通 Javascript(因为您使用的是 var),约定是名称采用 PascalCase 格式,属性采用 ALL_CAPS 格式。这可能是从 Java 约定继承的,并且当您使用以下模式创建不可变枚举时可能会更清楚:

class WinnerEnum {
    static get PLAYER_1() { return 1 }
    static get PLAYER_2() { return 2 }
    static get DRAW() { return 0 }
}

类名称按照约定采用 PascalCase ,并且 const 基元变量的常见模式是全部使用大写。作为一个实时权威示例,此模式用于 Chrome 扩展运行时 API 的 ContextType 枚举

对于 TypeScript,您应该遵循 枚举的官方 TypeScript 指南,它使用与您已经遵循的相同的大小写规则。这可能基于 C# 约定(两者都是 MS),其中除了局部变量之外的所有内容基本上都是 PascalCase。唯一的区别是您将使用 enum 关键字来声明它,而不是初始化 var。这些值也是可选的。例如,您可以在值从 0 自动递增的情况下执行此操作:

enum WinnerEnum {
    Draw,
    Player1,
    Player2,
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.