一般遇到的一個問題是日期的「1976-02-03 HH:mm:ss」這種格式 ,個人比較簡單的處理方法是這樣: javascript
- function formatDate(d) {
- var D=['00','01','02','03','04','05','06','07','08','09']
- with (d || new Date) return [
- [getFullYear(), D[getMonth()+1]||getMonth()+1, D[getDate()]||getDate()].join('-'),
- [D[getHours()]||getHours(), D[getMinutes()]||getMinutes(), D[getSeconds()]||getSeconds()].join(':')
- ].join(' ');
- }
這種方法是邏輯比較簡單的,並且規則也簡單。除了with(d||new Date)的使用以外,也算不上什麼技巧。可是,若是用這種方法來作數字字符串補0,那麼結果顯然不妙。51js的月影提供了另外一個方案: html
- function pad(num, n) {
- return Array(n>num?(n-(''+num).length+1):0).join(0)+num;
- }
調用示例以下:
月影在這裏分析了其中的技巧,以及代碼長短與效率上的平衡:
http://hi.baidu.com/akira_cn/blog/item/90ba2a8b07c867dafc1f1045.html java
最後月影推薦的是「質樸長存法」: 算法
- /* 質樸長存法 by lifesinger */
- function pad(num, n) {
- var len = num.toString().length;
- while(len < n) {
- num = "0" + num;
- len++;
- }
- return num;
- }
這個在「沒事就射鳥」同窗的博客裏作了分析: 數組
http://lifesinger.org/blog/2009/08/the-harm-of-tricky-code/ 緩存
月影同窗有一件事是沒有作的,就是沒說明「爲何那個短代碼的效率更低?」。 閉包
答案是「表面看來,用array.join來替代循環是高效的,但忘掉了一個數組建立的開銷」。對此有沒有法子呢?我有過另外一個解決的思路。以下: app
- /* 查表法(不完善) by aimingoo */
- pad = function(tbl) {
- return function(num, n) {
- return (((tbl[n = n-num.toString().length]) || (tbl[n] = Array(n).join(0))) + num);
- }
- }([]);
這個路子跟前面的formatDate()是同樣的,只不是formatDate()裏的表是一個肯定的數組,而這裏的數組則是動態生成,而後緩存 在tbl[]裏面。這個緩存的tbl[]數組是使用一個函數調用參數的形式,保持在最終的pad()函數的上層閉包裏面。爲了讓上面的這個過程清晰一點, 我重排代碼格式以下: 函數
- pad = function(tbl) {
- return function(num, n) {
- return (
- ((tbl[n = n-num.toString().length]) ||
- (tbl[n] = Array(n).join(0))) +
- num
- );
- }
- }([]);
好的。到這裏,先別急,還有兩個問題要解決。其一,當不須要補0時,上述的tbl[0]返回空值,因此會進入到「||」運算的第二個分支,所以致使 Array()重算一次,也就是說「不補0的狀況效率其實最低」。其二,當num長度大於n時,也就變成了「補負數個零」。「補負數個零」顯然不行,通常 對此處理成「不須要補零」,因而又回到了第一個問題。 spa
這兩個問題能夠一次解決,其實就是多一次判斷:
- /* 查表法(完善版本) by aimingoo */
- pad = function(tbl) {
- return function(num, n) {
- return (0 >= (n = n-num.toString().length)) ? num : (tbl[n] || (tbl[n] = Array(n+1).join(0))) + num;
- }
- }([]);
固然,也能夠象前面同樣整理一下這個代碼格式。或者,採用一個徹底不用「(函數式語言的)連續運算等技巧」的版本:
- /* 查表法(過程式版本) by aimingoo */
- pad = function() {
- var tbl = [];
- return function(num, n) {
- var len = n-num.toString().length;
- if (len <= 0) return num;
- if (!tbl[len]) tbl[len] = (new Array(len+1)).join('0');
- return tbl[len] + num;
- }
- }();
算法永遠都是如此,要不是時間換空間,要不就是空間換時間。射鵰同窗的「質樸長存法」是時間換空間的方法,而這裏的查表法則是空間換時間的方案。這 個函數會在tbl中持續一個字符串數組,若是num是很是常常變化的,那麼效率也不會有太大提高——對於過於頻繁變化的系統,緩存就意義不大了。其實邏輯 都差很少,月影同窗只是少走了一步而已。