在 JavaScript 中,函数参数的归一化处理是一种将不同类型或格式的参数转换为统一的标准或格式的过程。这样做的目的是为了提高代码的灵活性、可维护性和可重用性。
以下是一些常见的函数参数归一化处理的方式:
- 数据类型转换:将不同类型的参数转换为相同的数据类型,例如将字符串转换为数字,或者将对象转换为数组等。
- 默认值处理:为参数提供默认值,以便在调用函数时如果未提供该参数,仍然可以使用默认值进行处理。
- 参数验证:对传入的参数进行验证,确保它们符合函数的要求或预期的格式。可以检查参数是否为 null、undefined、特定的数据类型、满足一定的条件等。
- 参数解构:使用 ES6 中的参数解构来提取和处理参数,使代码更加简洁和易读。
- 参数映射或转换:对参数进行映射或转换,将一种格式的参数转换为另一种格式,以便更方便地进行后续处理。
- 错误处理:在参数归一化过程中,进行错误检查和处理,抛出异常或返回错误信息,以便在调用函数时能够及时处理错误情况。
通过进行函数参数的归一化处理,可以使函数更加健壮和灵活,能够处理各种不同情况下的参数。这样可以提高代码的可扩展性和可维护性,使函数更易于使用和重用。
下面是一个示例,展示了如何进行函数参数的归一化处理:(以格式化时间为例)
function _formatNormalize(formatter) {if (typeof formatter === "function") {return formatter;}if (typeof formatter !== "string") {throw new TypeError("formatter must be string or function");}if(formatter === 'data') {formatter = 'yyyy-MM-dd'}else if(formatter === 'datatime') {formatter = 'yyyy-MM-dd HH:mm:ss'}return (dataInfo) => {const {yyyy, MM, dd, HH, mm, ss, ms} = dataInforeturn formatter.replace('yyyy', yyyy).replace('MM', MM).replace('dd', dd).replace('HH', HH).replace('mm', mm).replace('ss', ss).replace('ms', ms)}
}/*** 格式化一个日期* @param {*} date 日期对象* @param {*} formatter 格式化参数,或 自定义函数* @param {*} isPad 小于10是否补0*/
function formate(date, formatter, isPad = false) {formatter = _formatNormalize(formatter);const dateInfo = {year: date.getFullYear(),month: date.getMonth() + 1,date: date.getDate(),hours: date.getHours(),minutes: date.getMinutes(),seconds: date.getSeconds(),milliseconds: date.getMilliseconds()}dateInfo.yyyy = isPad ? dateInfo.year.toString().padStart(4, 0) : dateInfo.yeardateInfo.MM = isPad ? dateInfo.month.toString().padStart(2, 0) : dateInfo.monthdateInfo.dd = isPad ? dateInfo.date.toString().padStart(2, 0) : dateInfo.datedateInfo.HH = isPad ? dateInfo.hours.toString().padStart(2, 0) : dateInfo.hoursdateInfo.mm = isPad ? dateInfo.minutes.toString().padStart(2, 0) : dateInfo.minutesdateInfo.ss = isPad ? dateInfo.seconds.toString().padStart(2, 0) : dateInfo.secondsdateInfo.ms = isPad ? dateInfo.milliseconds.toString().padStart(3, 0) : dateInfo.millisecondsreturn formatter(dateInfo)
}// 可调用方式// 2024-2-1
console.log(formate(new Date(), 'data'))// 2024-02-01 11:5:2
console.log(formate(new Date(), 'datatime'));// 2024-02-01
console.log(formate(new Date(), 'data', true))// {
// year: 2024,
// month: 3,
// date: 17,
// hours: 11,
// minutes: 39,
// seconds: 55,
// milliseconds: 471,
// yyyy: '2024',
// MM: '03',
// dd: '17',
// HH: '11',
// mm: '39',
// ss: '55',
// ms: '471'
// } info
formate(new Date(), (dateInfo) => {console.log(dateInfo, 'time')
}, true)