JavaScript 中的可枚举

2025 年 3 月 2 日 | 6 分钟阅读

在 JavaScript 中,通过枚举来表示一组固定的命名值。它们使程序员能够创建一组命名常量,这些常量可以在代码库中使用,以提高错误预防、可读性和可维护性。

枚举(通常称为 enums)在 JavaScript 中用于表示一组固定的命名值。由于 JavaScript 中没有内置枚举,通常使用对象或冻结数组来实现它们。

例如,星期几(如{"SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, and SATURDAY"})、颜色(如{"BLUE, RED, YELLOW, PINK, GREEN"})等,季节(如{"SUMMER, AUTUMN or FALL, SPRING, WINTER"}),以及方向(如{"EAST, WEST, NORTH, SOUTH, NORTH EAST, SOUTH EAST, and SOUTH WEST"})都可以包含在此类枚举中。

JavaScript 支持枚举吗?

JavaScript 缺少一个内置的枚举数据类型,尽管枚举数据类型通常在许多计算机语言中都有使用,包括 C++、Java 等。可以通过类和对象来实现 JavaScript 中的枚举功能。

语法

一个例子是使用带有整数值的枚举类型来编写我们的 JavaScript 代码。

代码

输出

Enumerable in JavaScript

这种方法可以用于小型代码库,尽管在某些情况下可能会导致歧义。开发者可能编写如下示例中的指令,例如将第一个字母小写,但字符串匹配失败并返回 false。

代码

输出

Enumerable in JavaScript

由于它们只是基本类型的两个值,开发者也可能设计不相关的枚举,这些枚举可能被条件运算符错误地匹配。让我们通过一个例子来分析这个问题。

代码

输出

Enumerable in JavaScript

在此示例中,创建了两个不同的枚举类型,但在 if 块的值检查期间,它们会混淆。我们想要的是其他东西。此外,使用整数或数字在逻辑上是错误的。例如,方向需要更有效地表示它们的种类,因为它们既不是字符串,也不是整数,也不是数字。

带有 Symbol 类型的枚举

JavaScript 中有一个称为 Symbol() 的概念。Symbol 不会相互冲突。因此,使用 Symbol 指定值将更合适且不易出错。以下是语法。

语法

让我们来看一个使用 Symbol 的类似案例,并确定它们是否会发生冲突。

代码

输出

Enumerable in JavaScript

创建不可变枚举类型

到目前为止,已经发现了一些枚举的实现。然而,存在一些问题。在最终的策略中,我们仍然可以通过简单地为枚举类型赋予新值来更新其值。可以通过将对象传递给 Object.freeze() 函数 来使其不可变,从而限制枚举的更新。让我们用这个作为例子。

语法

代码

输出

Enumerable in JavaScript

在 JavaScript 中,通过 for...in 循环或 Object.keys() 方法在迭代时可以查看的属性称为可枚举属性。通过属性初始化或简单赋值创建的所有属性默认都是可枚举的。

示例 1:代码定义了一个具有 registration、name、age 和 marks 属性的学生对象。对象的键在 for...in 循环中被迭代,其中每个键都被赋给一个变量 key。console.log(key) 语句将打印每个键的学生注册信息、姓名、年龄和分数。

代码

输出

Enumerable in JavaScript

由于属性初始化程序初始化了所有属性,因此默认情况下所有属性的可枚举性都设置为 true。

示例 2:Object.defineProperty() 方法用于显式修改属性的内部可枚举属性。此外,我们使用 propertyIsEnumerable() 函数来确定一个属性是否可枚举。如果属性可枚举,则返回 true;如果不可枚举,则返回 false。

代码

输出

Enumerable in JavaScript

总结

为了使我们的程序更易于阅读,我们可以使用通过枚举或 enum 数据类型创建的有序常量集合。与许多其他语言不同,JavaScript 不支持枚举类型。可以在 JavaScript 程序中以多种方式设计枚举。可以通过带有整数或字符串值的对象创建基本枚举;然而,这种方法在许多情况下不合适,因为同一类型的两个枚举可能会发生冲突。使用 Symbol 来防止冲突是一种潜在的解决方案。使用类作为枚举类型是我们使枚举不可变的最佳方式,这样我们就可以防止不必要的修改。