如何仅传一个参数让expectNumber自动获取参数名并实现原有功能?
简化expectNumber函数的参数传递方案
完全可以只传一个参数实现相同功能,核心思路是利用对象字面量的键名自动对应变量名,不用手动传入参数名。以下是两种直接可用的改造方案:
方案一:极简对象参数版
直接修改函数,让它接收一个包含目标变量的对象,内部自动提取变量名和值:
function expectNumber(obj) { // 从对象中取出第一个键值对(确保只传一个变量的对象) const [varName] = Object.keys(obj); const variable = obj[varName]; if (Number.isNaN(variable)) { throw new Error(`参数 ${varName} 不是有效数字`); } } // 调用方式(只传一个参数) expectNumber({ secWCanvas });
方案二:兼容旧调用的重载版
如果需要兼容原来的双参数调用,同时支持单参数模式,可以加个参数判断:
function expectNumber(arg1, arg2) { let variable, varName; if (arg2 === undefined) { // 单参数模式:arg1是包含变量的对象 const [key] = Object.keys(arg1); variable = arg1[key]; varName = key; } else { // 兼容原来的双参数调用 variable = arg1; varName = arg2; } if (Number.isNaN(variable)) { throw new Error(`参数 ${varName} 不是有效数字`); } } // 两种调用都支持 expectNumber({ secWCanvas }); // 新的单参数调用 expectNumber(secWCanvas, Object.keys({secWCanvas})[0]); // 旧的双参数调用
注意点
- 单参数调用时必须传对象字面量(比如
{secWCanvas}),不能直接传变量本身,否则函数无法获取变量名。 - 如果需要同时校验多个变量,可以扩展函数支持多键对象,但你的需求是单变量校验,上面的方案足够。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

