我正在用 Javascript 重建一个旧的 Java 项目,并意识到在 JS 中没有做枚举的好方法。
我能想到的最好的是:
const Colors = { RED: Symbol("red"), BLUE: Symbol("blue"), GREEN: Symbol("green") }; Object.freeze(Colors);
const保持不被重新分配,Colors并冻结它可以防止改变键和值。我正在使用 Symbols 所以它Colors.RED不等于0,或者除了它本身之外的任何东西。
const
Colors
Colors.RED
0
这个公式有问题吗? 有没有更好的办法?
(我知道这个问题有点重复,但 之前的所有 Q/ A都相当老了,ES6 为我们提供了一些新功能。)
编辑:
另一个解决序列化问题的解决方案,但我相信仍然存在领域问题:
const enumValue = (name) => Object.freeze({toString: () => name}); const Colors = Object.freeze({ RED: enumValue("Colors.RED"), BLUE: enumValue("Colors.BLUE"), GREEN: enumValue("Colors.GREEN") });
通过使用对象引用作为值,您可以获得与符号相同的碰撞避免。
这个公式有问题吗?
我没有看到。
有没有更好的办法?
我会将这两个语句合并为一个:
const Colors = Object.freeze({ RED: Symbol("red"), BLUE: Symbol("blue"), GREEN: Symbol("green") });
如果您不喜欢样板文件,例如重复Symbol调用,您当然也可以编写一个辅助函数makeEnum,从名称列表中创建相同的内容。
Symbol
makeEnum