javascript中Date对象的getDay方法使用指南


Posted in Javascript onDecember 22, 2014

Date对象有个getDay方法,它根据本地时间,返回一个具体日期中一周的第几天。返回值从0~6,分别对应周日~周六

getDay 0 1 2 3 4 5 6
星期几 周日 周一 周二 周三 周四 周五 周六

用到日期相关的需求时需要将getDay返回的值转成星期几,即“这一天”是星期几?比如日历组件中选择日历后返回 “2014-12-22 周一”。

javascript中Date对象的getDay方法使用指南

这是一段依然在线上运行的代码

/*

 * 根据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优化下

/*

 * 根据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,代码简且短清晰了不少。有人做过统计代码越简短,大脑思考的时间越短。因此你会看到各种《短码之美》,《代码简洁之道》等各种倡导和赞美“短码”的人和书。

《代码大全》提到利用表驱动法来简化编程

表驱动法 — 表驱动法是一种编程模式(scheme),从表里查找信息而不使用逻辑语句(if和switch)。事实上,凡是能通过逻辑语句来选择的,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链越来越复杂,查表法也就越发显得有吸引力。

上面提到利用表替代逻辑语句,JS里有不少前端工程师自从了解了函数式语言的一些特性,就拼命的用表达式消灭语句。比如

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语句。开始对这些写法比较上瘾,后来发现自己看不懂了(可能还是看的少,大脑总是自然的又将这些转换成语句),最后还是习惯用语句。

《代码大全》里说的表,我们用一个JS对象来替换试下

/*

 * 根据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字样的key存在。getDay方法返回的从0开始恰好和JS数组索引一样也是从0开始。因此用数组可以再简化下

/*

 * 根据Date对象返回星期几

 *  @param {Date} date

 *  @return {String} "星期三"

 */

function getChineseWeekByDate(date) {

    var numWeekDay = date.getDay();

    var weekArr = ['周日', '周一','周二','周三','周四','周五','周六'];

    return weekArr[numWeekDay] ||  '';

}
Javascript 相关文章推荐
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
Sep 15 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
Oct 21 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
Mar 03 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
Oct 17 Javascript
详解Javascript函数声明与递归调用
Oct 22 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
Oct 25 Javascript
详解vue项目的构建,打包,发布全过程
Nov 23 Javascript
ES6关于Promise的用法详解
May 07 Javascript
javascript、php关键字搜索函数的使用方法
May 29 Javascript
浅谈对于react-thunk中间件的简单理解
May 01 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
Sep 25 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 Vue.js
原生javaScript实现图片延时加载的方法
Dec 22 #Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 #Javascript
使用jQuery简单实现模拟浏览器搜索功能
Dec 21 #Javascript
编写简单的jQuery提示插件
Dec 21 #Javascript
不使用ajax实现无刷新提交表单
Dec 21 #Javascript
webapp框架AngularUI的demo改造之路
Dec 21 #Javascript
浅析webapp框架AngularUI的demo
Dec 21 #Javascript
You might like
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
python改变日志(logging)存放位置的示例
2014/03/27 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
python提取log文件内容并画出图表
2019/07/08 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
python pyenv多版本管理工具的使用
2019/12/23 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
学年自我鉴定
2014/01/16 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
PHP获取学生成绩的方法
2021/11/17 PHP
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
阿里云日志过滤器配置日志服务
2022/04/09 Servers
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js