Javascript TypeScript-在枚举上迭代时的奇怪行为

Javascript TypeScript-在枚举上迭代时的奇怪行为,javascript,typescript,Javascript,Typescript,我刚才在尝试迭代枚举时注意到了这一点 假设你有: enum Gender { Male = 1, Female = 2 } 而你做到了: for (let gender in Gender) { console.log(gender) } 这将运行4(?)次。首先打印字符串(!)表示1和2,然后打印字符串的公字符串和母字符串 我只能认为这是有意的。我的问题是为什么会这样?在我看来,这种奇怪的实现背后的原因是什么?JS没有枚举。TS将枚举编译为: var Gender;

我刚才在尝试迭代枚举时注意到了这一点

假设你有:

enum Gender {
    Male = 1,
    Female = 2
}
而你做到了:

for (let gender in Gender) {
    console.log(gender)
}
这将运行4(?)次。首先打印字符串(!)表示1和2,然后打印字符串的公字符串和母字符串


我只能认为这是有意的。我的问题是为什么会这样?在我看来,这种奇怪的实现背后的原因是什么?

JS没有枚举。TS将枚举编译为:

var Gender;
(function (Gender) {
    Gender[Gender["Male"] = 1] = "Male";
    Gender[Gender["Female"] = 2] = "Female";
})(Gender || (Gender = {}));
您可以看到其中有4个键(1,2,男性,女性)


您可以使用检查TS到JS编译输出。

这很有意义。但是for循环编译成什么呢?编译循环以反映TS enum而不是底层JS是否有意义?for…in语句会迭代对象的所有非符号、可枚举属性-