js enum 实现
在 JavaScript 中,原生并不直接支持枚举(enum),但可以通过多种方式模拟枚举的功能。以下是几种常见的实现方法:
使用对象模拟枚举
通过对象字面量定义键值对,实现枚举效果。这种方式简单直观,适合大多数场景。

const Color = {
RED: 'red',
GREEN: 'green',
BLUE: 'blue'
};
console.log(Color.RED); // 输出: red
使用冻结对象防止修改
通过 Object.freeze() 防止枚举值被意外修改,增强代码的健壮性。
const Direction = Object.freeze({
UP: 'up',
DOWN: 'down',
LEFT: 'left',
RIGHT: 'right'
});
Direction.UP = 'newValue'; // 静默失败(严格模式下报错)
console.log(Direction.UP); // 输出: up
使用类实现枚举
通过类的静态属性和私有特性(ES2022+)实现更复杂的枚举逻辑,例如添加方法或校验。

class Status {
static PENDING = new Status('pending');
static APPROVED = new Status('approved');
static REJECTED = new Status('rejected');
constructor(value) {
this.value = value;
}
toString() {
return this.value;
}
}
console.log(Status.PENDING.toString()); // 输出: pending
使用 TypeScript 的枚举语法
如果项目使用 TypeScript,可以直接使用原生 enum 语法,编译后会生成对应的 JavaScript 代码。
enum LogLevel {
ERROR = 1,
WARN = 2,
INFO = 3,
DEBUG = 4
}
console.log(LogLevel.ERROR); // 输出: 1
使用 Symbol 实现唯一值
通过 Symbol 确保枚举值的唯一性,避免与其他值冲突。
const LogLevel = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
WARN: Symbol('warn'),
ERROR: Symbol('error')
};
console.log(LogLevel.DEBUG === Symbol('debug')); // 输出: false
注意事项
- 如果需要反向映射(通过值获取键),可以手动实现或使用 TypeScript 的数值枚举。
- 冻结对象或使用
Symbol可以避免枚举值被修改,但可能增加代码复杂度。 - 在 TypeScript 中优先使用原生
enum,以获得类型检查和更好的工具支持。






