0
点赞
收藏
分享

微信扫一扫

JavaScript —— Symbol数据类型的延伸之(enum枚举)

代码敲到深夜 2022-04-07 阅读 110

Symbol数据类型的延伸之(enum枚举)

导语:Symbol是一种基本数据类型,每个从Symbol()返回的值都是唯一的。一个Symbol的值能作为对象属性的标识符,这是该数据类型仅有的目的。 ---- 《摘自MDN》

敲黑板:唯一的、标识符

上一回我们说了const常量,这回我们来说说同样值得我们讨论的,具有相对唯一性的,enum枚举类型。

一、Enum枚举的数字和字符串枚举

  1. 我们先来看一下数字枚举
enum Direction {
  Up = 1,
  Down,
  Left,
  Right
}

如上,我们定义了一个数字枚举,Up使用初始化为1。其余的成员会从1开始自动增长。换句话说,Direction.Up的值为1Down2Left3Right则为4

我们也可以完全不使用初始化器,得到的结果和上面是一样的:

enum Direction {
  Up,
  Down,
  Left,
  Right
}

使用枚举很简单,通过枚举的属性来访问枚举成员,或是通过枚举的名字来访问枚举类型:

enum Response {
  No = 0,
  Yes = 1
}

function respond(recipient: string, message: Response): void {
  // ...
  console.log(`${recipient} is ${message}`)
}

respond("火星", Response.No) // 火星 is 0

这是最常见的枚举形式,但是会有以下的问题:

  • 对打印不友好,打印出来的数值通常只有一个数字;
  • 类型不安全,枚举值不完全唯一,可以被其他数值干扰;
  • 成员无法检查,没办法检查枚举值是否是该类型的成员。

针对上面这些问题,那么我们自然而然的想到了另外一种更具备有唯一性的类型:

  1. 字符串枚举类型

例如我们声明一个字符串枚举:

enum Direction {
  Up = "Up",
  Down = "Down",
  Left = "Left",
  Right = "Right"
}

除此之外,还有异构枚举、联合枚举和const枚举,但无一例外,我们都是想让其具备有等级更高的唯一性。甚至于为了唯一性,我们还可以加上Symbol

enum Direction {
  Up = Symbol('Up'),
  Down = Symbol('Down '),
  Left = Symbol('Left'),
  Right = Symbol('Right')
}

二、总结分析

  1. 唯一性。Symbol总是唯一的,但enum枚举类型不是绝对唯一的,反而会受到其他数值干扰;
  2. 标识符。enum想让枚举更加靠近标识符的概念,有时反而会将数据变得越来越复杂(例如赋值字符串或者Symbol),相反Symbol就不会有这种烦恼;
  3. 日常开发中经常使用 enum 来规避魔数, 让代码更加整洁和规范, 可读性也较高,但这并不是我们最初的本意。
举报

相关推荐

0 条评论