javascript日期處理函數(shù),性能優(yōu)化批處理
其實(shí)網(wǎng)上寫javascript日期格式化的博文很多,大體都看了看,都還不錯(cuò)。唯一遺憾的是只顧著實(shí)現(xiàn)了功能,沒對(duì)函數(shù)進(jìn)行性能優(yōu)化。
俗話說:不要重復(fù)造輪子。google上找了一個(gè)比較不錯(cuò)的日期格式化函數(shù),來開始我的優(yōu)化之旅吧!
google上找的這個(gè)日期函數(shù)化函數(shù),估計(jì)大家都很眼熟,以前我也一直在用。先看看優(yōu)化后和優(yōu)化前的效率對(duì)比吧!
1、優(yōu)化之前的toDate函數(shù)(字符串轉(zhuǎn)換成Date對(duì)象),重復(fù)執(zhí)行1萬次,耗時(shí)660毫秒
2、優(yōu)化之前的dateFormat函數(shù)(Date對(duì)象格式化成字符串),重復(fù)執(zhí)行1萬次,耗時(shí)676毫秒
3、優(yōu)化過后的toDate函數(shù),重復(fù)執(zhí)行1萬次,耗時(shí)122毫秒
4、優(yōu)化后的dateFormat函數(shù),重復(fù)執(zhí)行1萬次,耗時(shí)160毫秒
為什么前后差別這么大,其實(shí)我也沒做多少處理,只是為批處理做了一些緩存而已,認(rèn)真觀察所有網(wǎng)上那些日期格式函數(shù),其實(shí)都是用正則進(jìn)行匹配和替換。其實(shí)正則是很耗性能的,于是我在正則匹配的地方做了緩存,把匹配值建立索引。以后就不用每次都去做正則匹配了。
無代碼無真相,接下來看看真相吧!
(function(window) { var sinojh = { Version : "1.2", Copyright : "Copyright© sino-jh 2012", Author : "Jeff Lan", Email : "jefflan@live.cn" }; /** * 方便于添加和重寫類的屬性 * @param {Object} attributes 添加的屬性 */ Function.prototype.prototypes = function(attributes) { for ( var a in attributes) { this.prototype[a] = attributes[a]; } }; /** * 獲取Url參數(shù) * @param {String} parameter 參數(shù)名 * @return {String} 參數(shù)值 */ sinojh.getUrlParameter = function(parameter) { if (!sinojh.getUrlParameter.cache) { var url = window.location.href; var paraString = url.substring(url.indexOf("?") + 1, url.length).split("&"); var cache = {}; for ( var i in paraString) { var j = paraString[i]; cache[j.substring(0, j.indexOf("="))] = j.substring(j.indexOf("=") + 1, j.length); } sinojh.getUrlParameter.cache = cache; } return sinojh.getUrlParameter.cache[parameter]; }; /** * 日期格式化 * @param {Date} date 日期對(duì)象 * @param {String} formatStyle 格式化樣式 * @return {String} 日期型字符串 */ sinojh.dateFormat = function(date, formatStyle) { formatStyle = formatStyle ? formatStyle : sinojh.dateFormat.settings.formatStyle; var time = { "M+" : date.getMonth() + 1, "d+" : date.getDate(), "h+" : date.getHours(), "m+" : date.getMinutes(), "s+" : date.getSeconds(), "S" : date.getMilliseconds() }; if (formatStyle == sinojh.dateFormat.formatStyleCache) { var replaceCache = sinojh.dateFormat.replaceCache; if (replaceCache["y+"]) { formatStyle = formatStyle.replace(replaceCache["y+"].replace, (date.getFullYear() + "").substring(replaceCache["y+"].index)); } for ( var k in time) { if (replaceCache[k]) { formatStyle = formatStyle.replace(replaceCache[k].replace, replaceCache[k].replace.length == 1 ? time[k] : ("00" + time[k]).substring(("" + time[k]).length)); } } } else { sinojh.dateFormat.formatStyleCache = formatStyle; var replaceCache = {}; if (new RegExp("(y+)").test(formatStyle)) { var index = 4 - RegExp.$1.length; replaceCache["y+"] = { replace : RegExp.$1, index : index }; formatStyle = formatStyle.replace(RegExp.$1, (date.getFullYear() + "").substring(index)); } for ( var k in time) { if (new RegExp("(" + k + ")").test(formatStyle)) { replaceCache[k] = { replace : RegExp.$1 }; formatStyle = formatStyle.replace(RegExp.$1, RegExp.$1.length == 1 ? time[k] : ("00" + time[k]).substring(("" + time[k]).length)); } } sinojh.dateFormat.replaceCache = replaceCache; } return formatStyle; }; sinojh.dateFormat.settings = { formatStyle : "yyyy-MM-dd hh:mm:ss" }; /** * 將日期格式的字符串轉(zhuǎn)換成Date對(duì)象 * @param {String} dateStr 日期格式字符串 * @param {String} dateStyle 日期格式 * @return {Date} 日期對(duì)象 */ sinojh.toDate = function(dateStr, dateStyle) { dateStyle = dateStyle ? dateStyle : sinojh.toDate.settings.dateStyle; var compare = sinojh.toDate.compare; var result = new sinojh.toDate.result(); if (dateStyle == sinojh.toDate.settings.dateStyleCache) { var indexCache = sinojh.toDate.indexCache; for ( var k in compare) { if (indexCache[k]) { result[compare[k]] = dateStr.substring(indexCache[k].index, indexCache[k].index + indexCache[k].length); } } } else { var indexCache = {}; for ( var k in compare) { if (new RegExp("(" + k + ")").test(dateStyle)) { var index = dateStyle.indexOf(RegExp.$1); var length = RegExp.$1.length; indexCache[k] = { index : index, length : length }; result[compare[k]] = dateStr.substring(index, index + length); } } sinojh.toDate.indexCache = indexCache; sinojh.toDate.settings.dateStyleCache = dateStyle; } return new Date(result["y"], result["M"] - 1, result["d"], result["h"], result["m"], result["s"], result["S"]); }; sinojh.toDate.compare = { "y+" : "y", "M+" : "M", "d+" : "d", "h+" : "h", "m+" : "m", "s+" : "s", "S" : "S" }; sinojh.toDate.result = function() { }; sinojh.toDate.result.prototypes( { "y" : "", "M" : "", "d" : "", "h" : "00", "m" : "00", "s" : "00", "S" : "000" }); sinojh.toDate.settings = { dateStyle : "yyyy-MM-dd hh:mm:ss" }; delete Function.prototype.prototypes; window.jh = sinojh; }(this);
- JavaScript AJAX之惰性載入函數(shù)
- 利用函數(shù)的惰性載入提高javascript代碼執(zhí)行效率
- JavaScript 函數(shù)惰性載入的實(shí)現(xiàn)及其優(yōu)點(diǎn)介紹
- JavaScript性能優(yōu)化之函數(shù)節(jié)流(throttle)與函數(shù)去抖(debounce)
- Javascript中產(chǎn)生固定結(jié)果的函數(shù)優(yōu)化技巧
- javascript教程:關(guān)于if簡(jiǎn)寫語句優(yōu)化的方法
- nodejs的10個(gè)性能優(yōu)化技巧
- JavaScript也談內(nèi)存優(yōu)化
- js性能優(yōu)化 如何更快速加載你的JavaScript頁(yè)面
- js 優(yōu)化次數(shù)過多的循環(huán) 考慮到性能問題
- javascript for循環(huán)從入門到偏門(效率優(yōu)化+奇特用法)
- JS性能優(yōu)化筆記搜索整理
- JS優(yōu)化與惰性載入函數(shù)實(shí)例分析
相關(guān)文章
詳解JavaScript中g(shù)etFullYear()方法的使用
這篇文章主要介紹了詳解JavaScript中g(shù)etFullYear()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06Javascript & DHTML 實(shí)例編程(教程)基礎(chǔ)知識(shí)
Javascript & DHTML 實(shí)例編程(教程)基礎(chǔ)知識(shí)...2007-06-06JavaScript 學(xué)習(xí)筆記(十三)Dom創(chuàng)建表格
下面弄個(gè)實(shí)例,運(yùn)用Dom的知識(shí),實(shí)例操作。2010-01-01JavaScript函數(shù)表達(dá)式詳解及實(shí)例
這篇文章主要介紹了JavaScript函數(shù)表達(dá)式詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05JavaScript的Set數(shù)據(jù)結(jié)構(gòu)詳解
這篇文章主要為大家介紹了JavaScript的Set數(shù)據(jù)結(jié)構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01JavaScript面向?qū)ο笾甤lass繼承類案例講解
這篇文章主要介紹了JavaScript面向?qū)ο笾甤lass繼承類案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Javascript核心讀書有感之表達(dá)式和運(yùn)算符
這篇文章主要介紹了Javascript核心讀書有感之表達(dá)式和運(yùn)算符,十分詳細(xì),需要的朋友可以參考下2015-02-02