js enum 实现
枚举的基本概念
JavaScript 本身没有内置的枚举(Enum)类型,但可以通过对象或类模拟枚举的功能。枚举通常用于定义一组命名的常量,提高代码可读性和可维护性。
使用对象模拟枚举
通过冻结对象防止属性被修改,实现最简单的枚举:
const Color = Object.freeze({
RED: 'red',
GREEN: 'green',
BLUE: 'blue'
});
console.log(Color.RED); // 输出: red
使用类模拟枚举(TypeScript风格)
通过类的静态属性和私有构造函数限制实例化,更接近传统枚举:
class Direction {
static UP = new Direction('up');
static DOWN = new Direction('down');
#value;
constructor(value) {
this.#value = value;
}
toString() {
return this.#value;
}
}
console.log(Direction.UP.toString()); // 输出: up
反向映射支持
传统枚举支持通过值反向获取键名,可通过额外逻辑实现:
const Status = (() => {
const _map = new Map();
const _reverseMap = new Map();
function _addEntry(key, value) {
_map.set(key, value);
_reverseMap.set(value, key);
}
_addEntry('PENDING', 0);
_addEntry('SUCCESS', 1);
return {
getValue: (key) => _map.get(key),
getKey: (value) => _reverseMap.get(value),
...Object.fromEntries(_map)
};
})();
console.log(Status.getKey(1)); // 输出: SUCCESS
TypeScript中的原生枚举
如果使用TypeScript,可直接使用内置枚举语法:

enum LogLevel {
ERROR = 0,
WARN = 1,
INFO = 2
}
let level: LogLevel = LogLevel.INFO;
枚举最佳实践
- 优先使用
Object.freeze避免意外修改 - 需要类型检查时使用TypeScript原生枚举
- 复杂场景可结合Symbol确保唯一性
- 大型项目推荐使用工具库(如
enumify)






