一、什么是函数参数的归一化?
函数归一化(Function Normalization)是一种将不同形态的输入参数转化为统一处理模式的设计思想, 能有效减少条件分支的代码。
二、利用函数归一化实现日期格式函数
function _formatNormalize(formatter) {
const defaultFormat = {
date: "YYYY/MM/DD",
datetime: "YYYY/MM/DD hh:mm:ss",
time: "hh:mm:ss",
}
if (typeof formatter === "string") {
return (dateInfo) => (defaultFormat[formatter] || formatter).replace(/YYYY|MM|DD|hh|mm|ss/g, match => dateInfo[match]);
} else if (typeof formatter === "function") {
return formatter;
} else {
console.error("formatter格式错误!")
}
}
/**
* 格式化一个日期
* @param {Date} date 日期对象
* @param {String} formatter 格式
* @param {Boolean} isPad 是否补位
*/
function dateForamte(date, foramtter, isPad = true) {
const dateInfo = {
"YYYY": date.getFullYear(),
"MM": date.getMonth() + 1,
"DD": date.getDate(),
"hh": date.getHours(),
"mm": date.getMinutes(),
"ss": date.getSeconds(),
}
for (key in dateInfo) {
dateInfo[key] = String(dateInfo[key]);
}
function _pad(prop, len) {
dateInfo[prop] = dateInfo[prop].padStart(len, "0");
}
if (isPad) {
_pad('YYYY', 4);
_pad('MM', 2);
_pad('DD', 2);
_pad('hh', 2);
_pad('mm', 2);
_pad('ss', 2);
}
// 全部归一成函数
return _formatNormalize(foramtter, isPad)(dateInfo);
}
// examples
dateForamte(new Date(), "date"); //2025/02/24
dateForamte(new Date(), "datetime");// 2025/02/24 20:22:19
dateForamte(new Date(), "time"); //20:22:19
dateForamte(new Date(), "YYYY-MM-DD"); //2025-02-24
dateForamte(new Date(), "YYYY/MM/DD hh:mm"); //2025/02/24 20:22
上面的代码中有两处归一化,一个是将函数的各种类型的参数通过_formatNormalize归一成函数,还有一个是将字符串类型的参数都归一成"YYYY/MM/DD"的格式。
三、相关知识
- String.prototype.padStart是ES6引入的字符串方法,用于将当前字符串用另一个字符串填充到指定长度,从开头开始填充。例如,
'5'.padStart(2, '0')会得到'05'。这在处理日期、时间补零的时候非常有用,比如月份显示为两位数字。 - Js中的月份是从0开始的
- 函数参数的归一化是将不同的函数参数类型归纳为一类进行处理