为何看似更复杂的JavaScript日期修改函数运行速度更快?
为什么专用于日期递减的decr_date比通用的inc_date运行更快?
先看两个函数的代码:
// 通用增减日期函数,测试显示速度较慢 function inc_date (date, inc_dec) { // 按天数增减日期 var tomorrow = new Date(date); tomorrow.setDate(tomorrow.getDate() + inc_dec); return(tomorrow.toISOString()) } console.log((inc_date("2023-01-01", -1)).split(" ")[0]) // 仅支持日期递减的函数,测试显示速度更快 function decr_date(date_str){ var parts = date_str.split("-"); var dt = new Date( parseInt(parts[0], 10), // 年份 parseInt(parts[1], 10) - 1, // 月份(Date对象月份从0开始) parseInt(parts[2], 10) // 日期 ); dt.setDate(dt.getDate() - 1); parts[0] = "" + dt.getFullYear(); parts[1] = "" + (dt.getMonth() + 1); if (parts[1].length < 2) { parts[1] = "0" + parts[1]; } parts[2] = "" + dt.getDate(); if (parts[2].length < 2) { parts[2] = "0" + parts[2]; } return parts.join("-"); } console.log(decr_date("2023-01-01"))
核心差异来自这几个方面:
toISOString()的高开销:inc_date最后调用tomorrow.toISOString(),这个方法内部要完成时区转换、全格式补零(年、月、日、时、分、秒、毫秒都要处理)、生成标准ISO格式字符串,是个重量级操作。而decr_date只是手动拼接年、月、日三个部分,逻辑简单直接,开销小很多。- 日期字符串解析的效率差:inc_date直接把日期字符串传给
new Date(),浏览器需要自动解析ISO格式,过程中要处理格式校验、时区判断等兼容逻辑;而decr_date先手动拆分日期部分,再把明确的数值传给Date构造函数,避免了内置解析的额外开销。 - 额外的字符串拆分步骤:inc_date返回ISO字符串后,还要通过
split(" ")[0]截取日期部分,多了一次字符串拆分操作;decr_date直接拼接出目标格式的字符串,一步到位,没有多余处理。 - 功能专一性带来的优化:decr_date只处理日期递减的单一场景,逻辑完全定制化;而inc_date是通用增减函数,Date对象的
setDate虽然支持正负参数,但内部会有更多边界处理逻辑(跨月、跨年的通用判断),相比专一场景的代码会有微小额外开销。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

