JavaScript Date对象getDay方法:从基础到表驱动法的代码演进
本文深入解析JavaScript中Date对象的getDay方法,展示如何将返回的0-6数值转换为中文星期。通过对比if-else、switch、三元运算符及对象数组查表等多种实现方式,重点推荐利用数组索引与getDay返回值天然对应的特性,采用表驱动法实现最简代码,提升可读性与执行效率。
getDay方法基础与星期转换需求
JavaScript中的Date对象提供了一个getDay方法,该方法依据本地时间返回指定日期所在周的第几天。其返回值范围是0到6,分别对应周日到周六。
getDay返回值与星期的对应关系如下:0代表周日,1代表周一,2代表周二,3代表周三,4代表周四,5代表周五,6代表周六。
在实际开发中,涉及日期处理的场景常需将getDay返回的数值转换为具体的星期中文名称,例如在日历组件中,用户选择日期后需显示如“2014-12-22 周一”这样的格式。

以下是一段目前仍在生产环境中运行的代码示例。
代码如下:
/*
* 根据Date对象返回星期几
* @param {Date} date
* @return {String} "星期三"
*/
function getChineseWeekByDate(date) {
var numWeekDay = date.getDay();
if (numWeekDay == 0) {
return '周日';
} else if (numWeekDay == 1) {
return '周一';
} else if (numWeekDay == 2) {
return '周二';
} else if (numWeekDay == 3) {
return '周三';
} else if (numWeekDay == 4) {
return '周四';
} else if (numWeekDay == 5) {
return '周五';
} else if (numWeekDay == 6) {
return '周六';
} else {
return '';
}
}
从if-else到switch的代码优化
上述代码通过一系列if-else分支判断getDay的返回值,从而返回对应的星期中文。有开发者指出,可以使用switch语句来优化这段代码。
代码如下:
/*
* 根据Date对象返回星期几
* @param {Date} date
* @return {String} "星期三"
*/
function getChineseWeekByDate(date) {
var numWeekDay = date.getDay();
switch (numWeekDay) {
case 0: return '周日';
case 1: return '周一';
case 2: return '周二';
case 3: return '周三';
case 4: return '周四';
case 5: return '周五';
case 6: return '周六';
default: return '';
}
}
与if-else相比,使用switch语句使代码更加简洁清晰。有统计表明,代码越简短,大脑处理和理解所需的时间越少。因此,业界推崇《短码之美》、《代码简洁之道》等理念,鼓励编写精简代码。
表驱动法与表达式替代逻辑
《代码大全》中提到了利用表驱动法来简化编程逻辑。
表驱动法是一种编程模式,它通过查找表格来获取信息,而非使用if或switch等逻辑语句。事实上,任何可以通过逻辑语句进行选择的场景,理论上都可以转化为查表操作。对于简单的情况,使用逻辑语句可能更直观;但随着逻辑链的复杂化,查表法的优势愈发明显。
前文提到利用表格替代逻辑语句。部分前端工程师在掌握函数式语言特性后,倾向于使用表达式消除语句,例如:
1. 使用&&运算符替代单条件if判断
代码如下:
if (a == 1) {
$.ajax(xx)
}
// -->
(a == 1) && $.ajax(xx)
2. 使用三元运算符?:替代if-else
代码如下:
if (a == 1) {
$.ajax(xx)
} else {
$(yy).remove()
}
// -->
(a == 1) ? $.ajax(xx) : $(yy).remove()
3. 多个if-else或switch也可以用嵌套的?:运算符替换
代码如下:
if (a == 1) {
alert(1)
} else if (a == 2) {
alert(2)
} else if (a == 3) {
alert(3)
} else {
alert(4)
}
// -->
(a == 1)
? alert(1) : (a == 2)
? alert(2) : (a == 3)
? alert(3) : alert(4)
此外,还可以利用函数递归来替代for或while循环语句。起初对这类写法感到新奇,但随后发现难以阅读(可能因接触较少,大脑会自动将其转换回语句逻辑),最终仍习惯使用传统的语句结构。
利用数组索引实现最简查表法
回到《代码大全》中提到的表,我们可以尝试使用JavaScript对象来替代逻辑判断。
代码如下:
/*
* 根据Date对象返回星期几
* @param {Date} date
* @return {String} "星期三"
*/
function getChineseWeekByDate(date) {
var numWeekDay = date.getDay();
var weekObj = {
'0': '周日',
'1': '周一',
'2': '周二',
'3': '周三',
'4': '周四',
'5': '周五',
'6': '周六',
};
return weekObj[numWeekDay] || '';
}
与switch相比,代码量进一步减少,但仍存在'0'到'6'这样的字符串键。注意到getDay方法返回的值从0开始,这与JavaScript数组的索引从0开始天然一致。因此,使用数组可以进一步简化代码。
代码如下:
/*
* 根据Date对象返回星期几
* @param {Date} date
* @return {String} "星期三"
*/
function getChineseWeekByDate(date) {
var numWeekDay = date.getDay();
var weekArr = ['周日', '周一','周二','周三','周四','周五','周六'];
return weekArr[numWeekDay] || '';
}D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
