You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中enum枚举与const常量的区别及适用场景

首先纠正一个基础语法错误:你贴的export enum LOOKUP_TABLE = {}是错误写法,TypeScript中定义enum不需要加等号,正确写法为export enum LOOKUP_TABLE { /* 成员定义 */ }。另外要先明确:enum不是原生JavaScript语法,是TypeScript独有的特性,必须经过TS编译才能在JS运行环境执行,原生浏览器、Node环境直接运行会报语法错误。

这两种写法不能直接无脑互换,二者的运行时表现、类型能力、适用场景差异很大,只有非常特定的场景下可以做等价替换。

二者核心差异与适用场景

export const 导出常量对象

这是ES6标准的原生JS语法,所有支持ES6的JS运行环境都可以直接执行,不需要额外编译。

  • 核心特点:
    运行时就是普通JS对象,除非手动加Object.freeze()冻结,否则对象的属性可以修改、扩展;没有任何额外编译产物,不会产生冗余代码,包体积零额外开销。
  • 适用场景:
    • 纯JavaScript项目,没有接入TypeScript编译链路时,这是唯一的选择
    • 查找表的值不是数字、字符串这类原始类型:比如要存储函数、复杂嵌套对象、DOM节点、正则实例等内容时,TS enum仅支持数字、字符串类型的成员,无法承载这类非原始值,只能用const对象
    • 有动态扩展、修改查找表内容的需求(注意:真正常量不建议随意修改,但const对象本身没有强不可变限制,有特殊动态需求时灵活性更高)
    • 对包体积极度敏感的场景:不会像TS enum那样编译后生成带双向映射的IIFE代码,没有多余体积
  • TS项目增强用法:给const对象加上as const断言,比如export const LOOKUP_TABLE = { ONLINE: 1, OFFLINE: 2 } as const,TS就可以推导出精确的字面量类型,实现和枚举接近的静态类型检查效果,这也是现在很多TS项目更推荐的写法,可以避开enum的不少隐式坑。

export enum 导出TS枚举

这是TS专属的语法特性,原生JS环境无法直接识别。

  • 核心特点:
    编译后会生成带双向映射的JS对象(只有数字枚举支持反向映射,即可以通过值反查对应的key,字符串枚举没有该能力);枚举的取值集合在编译阶段就完全固定,有独立的TS类型,可以直接用来标注函数参数、返回值类型,严格限制取值范围。
  • 适用场景:
    • TS项目中取值完全固定的集合:比如订单状态、用户角色、操作类型这类不会随意变更的值,用enum做类型标注后,TS在编译阶段就会检查传入的值是否在枚举范围内,传错值会直接报错,能提前发现不少低级bug
    • 需要反向映射的场景:比如后端返回数字类型的状态码,需要把状态码转成对应的文案key时,数字枚举自带的反向映射可以直接使用,不需要额外写反转对象的逻辑
    • 团队代码规范统一约定使用TS enum的场景,保持全项目代码风格一致
  • 注意坑点:数字枚举默认会从0开始自增赋值,如果没有手动给每个成员设置固定值,后续调整枚举成员顺序会导致对应的值变化,很容易引发线上bug;另外普通enum编译后会生成额外的运行时代码,对包体积有微小影响,如果不需要反向映射,更推荐使用const enum,编译时会直接把枚举值内联到调用位置,不会生成额外的运行时对象,体积更小。

总结来说,如果是TS项目中不需要反向映射的场景,优先用const 对象 + as const的写法灵活性更高,也没有额外运行时开销;如果确实需要枚举的强类型约束和反向映射特性,再选择enum即可。

内容的提问来源于stack exchange,提问作者sal3jfc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:45:36