多个成员之间使用逗号(,
)分隔。
注意:枚举中的成员,根据功能自己指定!
注意:枚举中的成员不是键值对!
- 使用枚举:
枚举是一种类型,因此,可以其作为变量的类型注解。
enum Gender { Female, Male }
let userGender: Gender
访问枚举(Gender)中的成员,作为变量(userGender)的值:
userGender = Gender.Female
userGender = Gender.Male
注意:枚举成员是只读的,也就是说枚举中的成员可以访问,但是不能赋值!
Gender.Female = ‘男’ // 错误!
- 枚举总结
枚举是组织有关联数据的一种方式。
使用场景:当变量的值,只能是几个固定值中的一个,应该使用枚举来实现。
enum Gender { Female, Male }
let userGender: Gender = Gender.Male
注意点:枚举中的成员是只读的,因此,只能访问不能赋值!
问题:将枚举成员赋值给变量,变量的值是什么呢?
enum Gender { Female, Male }
let userGender: Gender = Gender.Female
console.log(userGender) // ?
枚举成员是有值的,默认为:从 0 开始自增的数值。
我们把,枚举成员的值为数字的枚举,称为:数字枚举。
当然,也可以给枚举中的成员初始化值。
enum Gender { Female = 1, Male } // Female => 1 Male => 2
enum Gender { Female = 1, Male = 100 } // Female => 1 Male => 100
字符串枚举:枚举成员的值是字符串。
enum Gender { Female = ‘女’, Male = ‘男’ }
注意:字符串枚举没有自增长行为,因此,每个成员必须有初始值
。
console.log(Gender.Female) // 女
console.log(Gender.Male) // 男
- 两种常用的枚举总结:
enum Gender { Female, Male }
enum Gender { Female = 100, Male } // 初始化成员的值
特点:成员的值是从 0 开始自增的数值。
enum Gender { Female = ‘女’, Male = ‘男’ }
特点:没有自增行为,需要为每一个成员赋值!
枚举是一组有名字的常量(只读)的集合。
效果:使用枚举代替原来的字符串类名(x 和 o)。
-
创建字符串枚举(Player),提供 X 和 O 两个成员。
-
将变量(currentPlayer)的类型设置为 Player 枚举类型,默认值为 Player.X。
-
将成员 X 的值设置为:‘x’(类名);将成员 O 的值设置为:‘o’(类名)。
-
将所有用到 x 和 o 的地方全部使用枚举成员代替。
===================================================================
思路:判断棋盘中,横、竖、斜(对角线)是否存在三个相同的 x 或 o。
只要有一个满足条件,就说明 x 或 o 获胜了。
如果所有单元格都有内容,但没有获胜的情况,就说明是平局。
如何判断?
单元格元素列表(cells)中,每个单元格元素都有自己的索引,如下图所示:
使用单元格索引
,来表示每种获胜情况(使用数组
来存储,比如:[0, 1, 2])。
然后,使用一个“大”数组(外层),来存储这 8 种情况(因为每次判赢都要判断所有情况)。
判断过程:遍历这个大数组,分别判断每一种情况对应的 3 个单元格元素,是否都是相同的 x 或 o 类名。
只要有一种情况满足,就说明获胜了。
分析判赢数组
数组的基本结构:
[ 元素1, 元素2, … ]
判赢数组:每个元素又是数组(二维数组,概念知道即可)。
let winsArr = [
[0, 1, 2], [3, 4, 5], …
]
只要是数组用法都一样,比如:
// 访问数组元素:
winsArr[0] // [0, 1, 2]
winsArr[0][1] // 1
单元格元素列表说明
单元格元素列表(cells),实际上是一个伪数组
。
伪数组的特征:具有长度(length)属性和索引。
伪数组的操作:1 通过索引获取元素 2 使用 for 循环遍历(推荐使用 forEach 方法) 。
- 通过索引获取元素
console.log(cells[0])
console.log(cells[1])
- 使用 for 循环遍历
for (let i = 0; i < cells.length; i++) {
console.log(cells[i])
}
封装函数,主要考虑:参数和返回值。
-
该函数的返回值是什么? 布尔值(判断是否获胜)
-
该函数的有参数吗?是什么? 当前玩家
说明:判赢,就是在判断当前玩家下棋后是否获胜(玩家没下棋,不可能获胜,不需要判断)。
// 声明函数:
function checkWin(player: Player): boolean {}
// 调用函数:
let isWin = checkWin(currentPlayer)
技巧:如果想不到返回值和参数,可以反推,也就是从如何调用函数的角度来分析。
问题:什么时候判赢? 玩家点击单元格下棋后
-
声明函数(checkWin),指定参数(player),类型注解为:Player 枚举。
-
指定返回值:现在函数中写死返回 true 或 false。
-
在给单元格添加类名后(下棋后),调用函数 checkWin,拿到函数返回值。
-
判断函数返回值是否为 true,如果是,说明当前玩家获胜了。
思路:遍历判赢数组,分别判断每种情况对应的 3 个单元格元素,是否同时包含当前玩家的类名。
问题:使用哪种方式遍历数组呢?
只要有一种情况满足
,就表示玩家获胜,后续的情况就没有必要再遍历,因此,数组遍历时可以终止。
判赢函数的返回值是布尔类型,如果玩家获胜(有一种情况满足),就返回 true;否则,返回 false。
数组的 some 方法:1 遍历数组时可终止 2 方法返回值为 true 或 false。
思路:遍历判赢数组,分别判断每种情况对应的 3 个单元格元素,是否同时包含当前玩家的类名。
-
使用 some 方法遍历数组,并将 some 方法的返回值作为判赢函数的返回结果。
-
在 some 方法的回调函数中,获取到每种获胜情况对应的 3 个单元格元素。
-
判断这 3 个单元格元素是否
同时包含
当前玩家的类名。 -
如果包含(玩家获胜),就在回调函数中返回 true 停止循环;否则,返回 false,继续下一次循环。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
对象篇
模块化编程-自研模块加载器
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy82MTY4MzU2LWIxMTdmNzMyNDJlZjAyMDM?x-oss-process=image/format,png)
模块化编程-自研模块加载器