如何在JavaScript中定义枚举?

TypeScript的枚举是许多其他语言中非常方便的功能。然而,JavaScript目前没有类似的概念。但是,JavaScript在灵活性方面弥补了语法糖的不足。

定义枚举最简单的方法是使用Object.freeze()与普通对象结合使用。这将确保枚举对象不可变。

const daysEnum = Object.freeze({
  monday: 0,
  tuesday: 1,
  wednesday: 2,
  thursday: 3,
  friday: 4,
  saturday: 5,
  sunday: 6
});

更进一步,可以将逻辑提取到一个具有可变数量参数并生成冻结对象的函数中。这种技术几乎没有什么好处,因此更好的选择是创建一个简单的class。毕竟,枚举在面向对象编程语言中更常见,所以这听起来很合适。

Enum类只需要一个带有可变数量参数的constructor。它的工作是将每个键添加到枚举对象并冻结新创建的实例。一个潜在的增强是提供对枚举值的字符串访问。显然,可以使用Object.keys()来实现这一点,但是命名方法可能会与枚举的某个值冲突,更不用说方法会污染结果了。

在这里使用ES6符号是显而易见的解决方案,因为它不会污染Object.keys()的结果,也永远不会与枚举中的任何值冲突。更进一步,Symbol.iterator将是一个很好的选择,因为它允许将枚举视为可迭代对象,并使其更加有用。将所有这些组合在一起,这是我的Enum类及其使用方法:

```js class Enum { constructor(...keys) { keys.forEach((key, i) => { this[key] = i; }); Object.freeze(this); }

*Symbol.iterator { for (let key of Object.keys(this)) yield key; } }

const daysEnum = new Enum( 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday' );

const days = [...daysEnum]; // 将枚举值转换为字符串的数组