【发布时间】:2021-03-14 22:19:13
【问题描述】:
我确实按照 this idea 在 JavaScript 中使用符号创建了一个 Enum(-like) 结构:
const DATA = Object.freeze({
GOOD: Symbol("good"),
BAD: Symbol("bad"),
I_DONT_CARE: Symbol("i-dont-care"),
});
现在,我想使用(唯一)符号创建一个新对象来引用每个项目并扩展有关它的数据:
const TRANSLATION = Object.freeze({
[DATA.GOOD]: "Gut",
[DATA.BAD]: "Schlecht",
[DATA.I_DONT_CARE]: "Egal",
});
这确实是有效的even though e.g. TypeScript did not believe that and complained,但这也正在修复中。
但是,现在的问题是,如果我使用Object.entries(TRANSLATION)(或Object.keys(TRANSLATION) / Object.values(TRANSLATION))进一步编辑和转换该对象,我会得到一个空对象。
似乎所有Symbols 在迭代时都被忽略了:
myenum = {
"bla": "blub",
[Symbol("test")]: "testData"
}
console.log(Object.keys(myenum));
我不希望这样,我只想使用符号作为唯一键,这样我就可以将更多信息存储/“映射”到特定条目。
【问题讨论】:
-
这些方法就是这样定义的。
-
这是为了保持一致性。在 ES6 之前,我们有
Object.keys但没有符号,所以Object.keys(obj)在 ES5 和 ES6 中必须以不同方式工作,这使得代码不稳定。Object.entries的添加较晚,但是如果迭代符号,它将与Object.keys不一致。Object.getOwnPropertySymbols仅提取符号或Object.getOwnPropertyDescriptors提取所有内容。 -
另外,还有
Reflect.ownKeys(我一直忘记Reflect,因为我不经常使用它)。
标签: javascript ecmascript-6 enums iteration