我正在开发一个 javascript 项目,该项目需要使用 javascript“Enums”,意思是像这样的对象:
var WinnerEnum = {
Player1: 1,
Player2: 2,
Draw: 0
};
这对我来说非常有用,但是,我不知道命名枚举的正确方法(根据惯例)是什么,因为据我所知,只有类名以大写字母开头(表示调用构造函数的能力)开)。
JSHint 还输出以下警告:
Missing 'new' prefix when invoking a constructor.
如果没有约定,我希望有一种命名枚举的好方法,不会将它们与类名混淆。 2014 年更新:JSHint 不再这样做。
这确实是命名枚举的正确方法,但枚举值应该是 ALL_CAPS 而不是 UpperCamelCase,如下所示:
var WinnerEnum = {
PLAYER_1: 1,
PLAYER_2: 2,
DRAW: 0
};
这类似于 Java 的枚举命名约定。
一些参考:
与一般的编码风格一样,您会发现人们以多种不同的方式做事,每种方式都有其自己的一套充分的理由。然而,为了让任何人都能更轻松地阅读和使用您的代码,我建议使用具有最权威参考文献的样式,因此通常是最广泛采用的样式。
我找不到比 Google 的风格指南和上面的著作更权威的参考文献,这些文章是由认真思考过枚举的人撰写的,但我很想听听任何更好的参考文献。
根据 Google 的编码约定,这确实是在 javascript 中命名枚举的正确方法。
根据要求这是一个链接。
首先,在 JS 中没有声明伪枚举的“正确”方法*。如果可能的话,您应该努力在现有代码库和/或组织的约定中保持一致。
一个流行的约定是Google JavaScript 样式指南。例如:
const TemperatureScale = {
CELSIUS: 'celsius',
FAHRENHEIT: 'fahrenheit',
};
奇怪的是,这与 MDN 的 const
的
隐藏约定不一致,如 Google 的示例中,
TemperatureScale
是 const
而 TemperatureScale.CELSIUS
不是!
* 它必须是有效的 JavaScript 标识符。
命名方面,这取决于您使用的是 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,
}