Symbol数据类型的延伸之(enum枚举)
导语:Symbol
是一种基本数据类型,每个从Symbol()
返回的值都是唯一的。一个Symbol
的值能作为对象属性的标识符,这是该数据类型仅有的目的。 ---- 《摘自MDN》
敲黑板:唯一的、标识符
上一回我们说了const
常量,这回我们来说说同样值得我们讨论的,具有相对唯一性的,enum
枚举类型。
一、Enum枚举的数字和字符串枚举
- 我们先来看一下数字枚举
enum Direction {
Up = 1,
Down,
Left,
Right
}
如上,我们定义了一个数字枚举,Up
使用初始化为1
。其余的成员会从1
开始自动增长。换句话说,Direction.Up
的值为1
,Down
为2
,Left
为3
,Right
则为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
这是最常见的枚举形式,但是会有以下的问题:
- 对打印不友好,打印出来的数值通常只有一个数字;
- 类型不安全,枚举值不完全唯一,可以被其他数值干扰;
- 成员无法检查,没办法检查枚举值是否是该类型的成员。
针对上面这些问题,那么我们自然而然的想到了另外一种更具备有唯一性的类型:
- 字符串枚举类型
例如我们声明一个字符串枚举:
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')
}
二、总结分析
- 唯一性。
Symbol
总是唯一的,但enum
枚举类型不是绝对唯一的,反而会受到其他数值干扰; - 标识符。
enum
想让枚举更加靠近标识符的概念,有时反而会将数据变得越来越复杂(例如赋值字符串或者Symbol),相反Symbol
就不会有这种烦恼; - 日常开发中经常使用
enum
来规避魔数, 让代码更加整洁和规范, 可读性也较高,但这并不是我们最初的本意。