小编典典

ES6 中的 Javascript 枚举

all

我正在用 Javascript 重建一个旧的 Java 项目,并意识到在 JS 中没有做枚举的好方法。

我能想到的最好的是:

const Colors = {
    RED: Symbol("red"),
    BLUE: Symbol("blue"),
    GREEN: Symbol("green")
};
Object.freeze(Colors);

const保持不被重新分配,Colors并冻结它可以防止改变键和值。我正在使用 Symbols
所以它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")
});

通过使用对象引用作为值,您可以获得与符号相同的碰撞避免。


阅读 177

收藏
2022-07-17

共1个答案

小编典典

这个公式有问题吗?

我没有看到。

有没有更好的办法?

我会将这两个语句合并为一个:

const Colors = Object.freeze({
    RED:   Symbol("red"),
    BLUE:  Symbol("blue"),
    GREEN: Symbol("green")
});

如果您不喜欢样板文件,例如重复Symbol调用,您当然也可以编写一个辅助函数makeEnum,从名称列表中创建相同的内容。

2022-07-17