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優化下
/* * 根據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] || ''; }