如何简化JS无序参数函数实现?寻求最佳实践
简化参数顺序不固定的JavaScript函数实现
我有一段可正常运行但步骤繁琐的JavaScript代码,希望简化实现步骤。需求是实现一个名为show的函数,接收name(字符串类型)、age(数字类型)、status(布尔类型)三个参数,但调用时参数传入顺序不固定(示例调用:console.log(show(true,25,'mostafa')))。当前代码通过枚举所有参数类型组合的方式处理逻辑,现寻求该函数的最佳实践方案。
原代码如下:
function show(name="mostafa",age=0,status=true){ let result; let status1= (status == true || age == true || name == true) ? `you are available for hiring` : `you are not available for hiring`; result= (typeof name == 'string' && typeof age == 'number' && typeof status == 'boolean') // abc ?`welcome ${name} your age is ${age} ,${status1}` :(typeof name == 'string' && typeof status == 'number' && typeof age == 'boolean') // acb ?`welcome ${name} your age is ${status} ,${status1}` :(typeof age == 'string' && typeof name == 'number' && typeof status == 'boolean') // bac ?`welcome ${age} your age is ${name} ,${status1}` :(typeof age == 'string' && typeof status == 'number' && typeof name == 'boolean') // bca ?`welcome ${age} your age is ${status} ,${status1}` :(typeof status == 'string' && typeof name == 'number' && typeof age == 'boolean') // cab ?`welcome ${status} your age is ${name} ,${status1}` :(typeof status == 'string' && typeof age == 'number' && typeof name == 'boolean') // cba ?`welcome ${status} your age is ${age} ,${status1}` :`damn !!` return result } console.log(show(true,25,'mostafa'))
方案一:基于类型自动识别参数
不用枚举所有参数排列组合,直接遍历传入的参数,根据类型分配到对应的变量上,同时保留默认值:
function show(...args) { // 设置默认值 let name = "mostafa"; let age = 0; let status = true; // 遍历参数,按类型覆盖默认值 args.forEach(arg => { const type = typeof arg; if (type === 'string') name = arg; else if (type === 'number') age = arg; else if (type === 'boolean') status = arg; }); // 生成状态文本 const statusText = status ? 'you are available for hiring' : 'you are not available for hiring'; return `welcome ${name} your age is ${age} ,${statusText}`; } console.log(show(true,25,'mostafa')); // 输出:welcome mostafa your age is 25 ,you are available for hiring
这种方式兼容原有的位置传参调用方式,代码量大幅减少,逻辑清晰。但局限性也很明显:如果后续新增参数类型有重叠(比如新增一个数字类型的参数),就会出现赋值冲突。
方案二:对象传参(推荐最佳实践)
直接让函数接收一个对象参数,通过解构赋值设置默认值。调用时通过键名指定参数,完全不用关心顺序,可读性和扩展性拉满:
function show({ name = "mostafa", age = 0, status = true } = {}) { const statusText = status ? 'you are available for hiring' : 'you are not available for hiring'; return `welcome ${name} your age is ${age} ,${statusText}`; } // 调用示例,顺序随意 console.log(show({ status: true, age: 25, name: 'mostafa' })); // 省略部分参数,自动使用默认值 console.log(show({ age: 30 }));
这种方式是JavaScript处理多参数、参数顺序不固定场景的标准方案,不仅解决了顺序问题,后续新增参数时只需在解构中添加新的默认值即可,不会影响原有调用,同时代码可读性更高,完全避免了类型识别可能带来的冲突问题。
内容的提问来源于stack exchange,提问作者mostafa taha
相关产品推荐
相关产品推荐

