Open Vitaminaq opened 2 years ago
数字枚举 对应的值以索引或上一个值自增,且支持反向映射,如有相同值则会被覆盖。
enum Test { A, // Test.A = 0 B, // Test.B = 1 C // Test.C = 2 } // 反向映射 console.log(Test[0]); // A enum Test { A = 4, // Test.A = 4 B, // Test.B = 5 C // Test.C = 6 } // 覆盖 enum Test { A = 2, // Test.A = 4 B = 1, // Test.B = 5 C // Test.C = 6 } // 反向映射 console.log(Test[2]); // C
字符串枚举 同数字枚举,没有反向映射,必须赋值。 异构枚举 数字,字符串混合,不能包含计算枚举。
// 异构 enum Test { A = '2', B = 1 } // 报错 enum Test { A = '2', B = 1 * 2 }
计算枚举 支持各类计算(数字,字符串)混合,编译时会提前计算好。
// 稍微改动下上面报错的例子 enum Test { A = '2' + '1', B = 1 * 2 }
编译后的结果:
var Test; (function (Test) { Test["A"] = "21"; Test[Test["B"] = 2] = "B"; })(Test || (Test = {}));
常量枚举 - const 由上面编译后的结果看会生成一个比较复杂的函数,一般我们使用的都是比较普通的枚举,为了节省开销和性能,就出现了常量枚举,它会在编译阶段删除该对象,且不能访问自身,只能访问其属性。 假设我们只声明一个枚举,则编译后的文件为空:
const enum Test { A, B } // 编译出的是一个空文件夹
正常有使用的情况:
const enum Test { A, B } Test.A;
编译后结果:
0 /* A */;
从结果可以看出,在编译阶段是删除了之前一大坨复杂的函数,并且所使用的枚举属性替换成了对应的值。
简易测试方式:
数字枚举 对应的值以索引或上一个值自增,且支持反向映射,如有相同值则会被覆盖。
字符串枚举 同数字枚举,没有反向映射,必须赋值。 异构枚举 数字,字符串混合,不能包含计算枚举。
计算枚举 支持各类计算(数字,字符串)混合,编译时会提前计算好。
编译后的结果:
常量枚举 - const 由上面编译后的结果看会生成一个比较复杂的函数,一般我们使用的都是比较普通的枚举,为了节省开销和性能,就出现了常量枚举,它会在编译阶段删除该对象,且不能访问自身,只能访问其属性。
假设我们只声明一个枚举,则编译后的文件为空:
正常有使用的情况:
编译后结果:
从结果可以看出,在编译阶段是删除了之前一大坨复杂的函数,并且所使用的枚举属性替换成了对应的值。
简易测试方式: