枚举是对JavaScript标准数据类型集的扩充,常被用来限定在一定范围内取值的场景。在TypeScript中支持数字和字符串的枚举。我们可以用enum来实现。
先看看一个数字枚举例子:
enum Basketballer{
Yao,
Yi,
Wang
}
Basketballer.Yao; //0
Basketballer.Yi; //1
Basketballer.Wang; //2
我们也可以这样,下面这个方法被称为反向映射,即通过值来访问键:
Basketballer[0]; //"Yao"
Basketballer[1]; //"Yi"
Basketballer[2]; //"Wang"
Basketballer[3]; //undefined
上面的例子,我们没有对Yao或者其它成员进行初始化,如果我们进行初始化:
enum Basketballer{
Yao = 1,
Yi,
Wang
}
Basketballer.Yao; //1
Basketballer.Yi; //2
Basketballer.Wang; //3
Basketballer[1]; //"Yao"
Basketballer[2]; //"Yi"
Basketballer[3]; //"Wang"
从上面可以看出,如果一个成员设了一个值,那么后面相应的值都会递增。但是要注意的是,如果没有什么特殊的目的的话,还是不要对多个成员进行手动赋值。因为有时候可能会导致一些问题:
enum Basketballer{
Yao = 1,
Yi,
Wang = 2,
Zhu,
Zhou,
}
Basketballer[2]; //"Wang"
Basketballer.Yi; //2
一个枚举的简单应用:
enum Basketballer{
Yao = 1,
Yi,
Wang,
Zhu,
Zhou,
}
function one(arg: Basketballer): string{
let num = arg;
switch (num) {
case 1:
return Basketballer[num] + "第一人";
case 2:
return Basketballer[num] + "第二人";
case 3:
return Basketballer[num] + "第二人";
default:
return "篮球";
}
}
one(1); //"Yao第一人"
one(6); // "篮球人"
one("1"); //错误,“1”类型的参数不能分配给Basketballer
在数字枚举中,我们在定义枚举成员值的时候,可以是常量,也可以是计算出来的:
1、枚举的第一个成员且没有初始化:
enum Basketballer{
Yao
}
Basketballer.Yao; //0
2、不带初始化器并且它之前的成员是一个数字常量:
enum Basketballer1{
Yao, //0
Yi, //1
Wang //2
}
enum Basketballer2{
Yao = 1, //1
Yi, //2
Wang //3
}
3、枚举成员使用常量枚举表达式初始化。当下面条件满足其中之一,就是一个常量枚举表达式:
一个枚举表达式字面量(主要是字符串字面量或数字字面量)
enum Man{ a = 1}
一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
enum Man{ a = 1, b = 2*a}
带括号的常量枚举表达式
enum Man{ a = 1, b = 2*(a +1)}
一元运算符 +, -, ~其中之一应用在了常量枚举表达式
enum Man{ a = 1, b= ~a}
常量枚举表达式做为二元运算符 +, -, *, /, %, <<, >>, >>>, &, |, ^的操作对象。 若常数枚举表达式求值后为 NaN或 Infinity,则会在编译阶段报错。
enum Man{ a = 1 << 2}
除开上面所举的所有枚举成员都被当作是需要计算出来的值:
enum Man{ a = "abc".length }
字符串枚举中没有自增的特性,我们在初始化的时候必须给每一个成员都设字符串。
enum Basketballer{
Yao = "篮协主席",
Yi = "牌面",
Wang = "老大哥",
}
Basketballer.Yao; //"篮协主席"
但是字符串枚举没有反向映射:
Basketballer["篮协主席"]; // 错误
异构枚举相当于数字枚举和字符串枚举的结合体,但是官方文档不建议这样写。
enum Basketballer{
Yao = "篮协主席",
Yi = 1,
}
我们可以通过const修饰符来强调当前枚举类型,const枚举只能使用使用常量枚举表达式,而且会在编译阶段被删除。我们可以用const enum来定义:
const enum Man {
A,
B,
C,
D
}
let man = [Man.A, Man.B, Man.C, Man.D];
console.log(man); // [0, 1, 2, 3]
让我们看看编译结果:
let man = [0 /* A */, 1 /* B */, 2 /* C */, 3 /* D */];
console.log(man); // [0, 1, 2, 3]
外部枚举用来描述已经存在的枚举类型的形状,可以用declare enum来定义:
declare enum Man {
A,
B,
C,
D
}
let man = [Man.A, Man.B, Man.C, Man.D];
让我们看看编译结果:
let man = [Man.A, Man.B, Man.C, Man.D];
用for...in循环和Object.keys方法都可以获取对象的属性,那么它们有什么区别呢?getOwnPropertyNames方法输出的结果中还包含了对象的不可枚举属性,可以通过Object.propertyIsEnumerable来判断属性是否可枚举从而对结果进行过滤
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。
题目:在1,2,3,4,5 五个数中,我们随机选取 3个数。问有多少种取法?并且把每种取出数的方法列举出来。乍看这道题,其实感觉没什么难度。三个for循环不就解决问题了。
数字类型枚举:常规枚举的值都是数字类型,因此被称为数字类型枚举;改变与数字枚举关联的数字:默认情况下,第一个枚举值是 0,后续的值会递增。
在当前的javascript中,并没有枚举这个概念,在某些场景中使用枚举更能保证数据的正确性,减少数据校验过程,下面就介绍一下javascript如何模拟实现枚举效果。
使用枚举类型可以允许我们定义一些带名字的常量,也可以清晰地表达意图或创建一组有区别的用例。在 TypeScript 中,支持数字的和基于字符串的枚举。
枚举是受 TypeScript 支持的数据类型。枚举允许您定义一组命名常量。使用它们可以更轻松地记录意图或创建一组不同的案例。枚举大多数用于面向对象的编程语言(如 Java 和 C#)中
枚举的好处是,我们可以定义一些带名字的常量,而且可以清晰地表达意图或创建一组有区别的用例,TS支持数字的和基于字符串的枚举,首先来看数字枚举
假设有这样一个场景,我们需要统计员工的技术栈,目前我们需要标记的技术有 CSS、JavaScript、HTML、WebGL。然后我可以这样写枚举:
枚举 Enum是在众多语言中都有的一种数据类型,JavaScript中还没有(TypeScript有)。用来表示一些特定类别的常量数据,如性别、学历、方向、账户状态等,项目开发中是很常用的。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!