国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

在js中做數(shù)字字符串補(bǔ)0(js補(bǔ)零)

2019-11-19 17:01:58
字體:
供稿:網(wǎng)友

通常遇到的一個(gè)問題是日期的“1976-02-03 HH:mm:ss”這種格式 ,我的比較簡單的處理方法是這樣:

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(' ');}

這種方法是邏輯比較簡單的,而且規(guī)則也簡單。除了with(d||new Date)的使用之外,也算不上什么技巧。但是,如果用這種方法來做數(shù)字字符串補(bǔ)0,那么結(jié)果顯然不妙。51js的月影提供了另一個(gè)方案:

function pad(num, n) { return Array(n>num?(n-(''+num).length+1):0).join(0)+num;}

調(diào)用示例如下:

pad(100, 4); // 輸出:0100

月影在這里分析了其中的技巧,以及代碼長短與效率上的平衡:
最后月影推薦的是“質(zhì)樸長存法”:

/* 質(zhì)樸長存法 by lifesinger */function pad(num, n) {  var len = num.toString().length;  while(len < n) {    num = "0" + num;    len++;  }  return num;}

這個(gè)在“沒事就射鳥”同學(xué)的博客里做了分析
月影同學(xué)有一件事是沒有做的,就是沒說明“為什么那個(gè)短代碼的效率更低?”。
答案是“表面看來,用array.join來替代循環(huán)是高效的,但忘掉了一個(gè)數(shù)組創(chuàng)建的開銷”。對(duì)此有沒有法子呢?我有過另一個(gè)解決的思路。如下:

/* 查表法(不完善) by aimingoo */pad = function(tbl) { return function(num, n) {  return (((tbl[n = n-num.toString().length]) || (tbl[n] = Array(n).join(0))) + num); }}([]);

這個(gè)路子跟前面的formatDate()是一樣的,只不是formatDate()里的表是一個(gè)確定的數(shù)組,而這里的數(shù)組則是動(dòng)態(tài)生成,然后緩存在tbl[]里面。這個(gè)緩存的tbl[]數(shù)組是使用一個(gè)函數(shù)調(diào)用參數(shù)的形式,保持在最終的pad()函數(shù)的上層閉包里面。為了讓上面的這個(gè)過程清晰一點(diǎn),我重排代碼格式如下:

pad = function(tbl) { return function(num, n) {  return (   ((tbl[n = n-num.toString().length]) ||    (tbl[n] = Array(n).join(0))) +   num  ); }}([]);

好的。到這里,先別急,還有兩個(gè)問題要解決。其一,當(dāng)不需要補(bǔ)0時(shí),上述的tbl[0]返回空值,所以會(huì)進(jìn)入到“||”運(yùn)算的第二個(gè)分支,因此導(dǎo)致Array()重算一次,也就是說“不補(bǔ)0的情況效率其實(shí)最低”。其二,當(dāng)num長度大于n時(shí),也就變成了“補(bǔ)負(fù)數(shù)個(gè)零”。“補(bǔ)負(fù)數(shù)個(gè)零”顯然不行,一般對(duì)此處理成“不需要補(bǔ)零”,于是又回到了第一個(gè)問題。

這兩個(gè)問題可以一次解決,其實(shí)就是多一次判斷:

/* 查表法(完善版本) 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; }}([]);

當(dāng)然,也可以象前面一樣整理一下這個(gè)代碼格式。或者,采用一個(gè)完全不用“(函數(shù)式語言的)連續(xù)運(yùn)算等技巧”的版本:

/* 查表法(過程式版本) 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; }}();

算法永遠(yuǎn)都是如此,要不是時(shí)間換空間,要不就是空間換時(shí)間。射雕同學(xué)的“質(zhì)樸長存法”是時(shí)間換空間的方法,而這里的查表法則是空間換時(shí)間的方案。這個(gè)函數(shù)會(huì)在tbl中持續(xù)一個(gè)字符串?dāng)?shù)組,如果num是非常經(jīng)常變化的,那么效率也不會(huì)有太大提升――對(duì)于過于頻繁變化的系統(tǒng),緩存就意義不大了。其實(shí)邏輯都差不多,月影同學(xué)只是少走了一步而已。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 紫阳县| 梨树县| 云和县| 哈尔滨市| 中宁县| 杂多县| 贡山| 盐津县| 普陀区| 米易县| 湖北省| 吴桥县| 正安县| 达孜县| 宜兰县| 凌源市| 达州市| 唐海县| 永清县| 瓮安县| 嵩明县| 肥东县| 安达市| 莱州市| 武冈市| 大石桥市| 定西市| 黄平县| 胶州市| 利津县| 行唐县| 淳化县| 沁阳市| 龙井市| 缙云县| 珠海市| 昌吉市| 新竹市| 新竹市| 九寨沟县| 泸定县|