Vitaminaq / interview-collection

前端面试合集
3 stars 0 forks source link

ts声明枚举,有无const的区别 #23

Open Vitaminaq opened 2 years ago

Vitaminaq commented 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 */;

从结果可以看出,在编译阶段是删除了之前一大坨复杂的函数,并且所使用的枚举属性替换成了对应的值。

简易测试方式:

  1. 全局安装typescript,即npm install -g typescript。
  2. 新建xxx.ts文件。
  3. 命令行执行tsc xxx.ts。