js怎么优雅的实现参数的传递覆盖?
类似于patch请求,我传递了值的参数就覆盖,没有传递值就默认.
目前写的是ifelse判断 感觉太僵硬了
现在的条件判断是 :当前不传参 就给HOST默认值
传参(hsot),就把host赋值给HOST
设想一种情况:要传多个参数值:arg1,arg2,arg3
arg1,arg2我传了值,arg3没传递,按照现在的ifelse逻辑就会报错
怎么优雅的实现参数赋值?
大佬们给点意见
已解决
悬赏分:40
- 解决时间 2021-11-26 12:09
点赞 0反对 0举报 0
收藏 0
分享 0
回答6
最佳
-
一些个人见解:
- 函数定义的时候把参数按重要性排列;
- 采用三目运算符或者 ‘||’ 运算符对参数设置默认值;
- 使用 ES6+ 或者 TypeScript。
ES5 版本类似于:
function foo(arg1, arg2, arg3){ // 验证必选参数合法性 if('number' !== typeof arg1) throw 'InvalidArgumentException: arg1 must be a number'; // 带默认值的可选参数 var arg2 = 'string' === typeof arg2? arg2: 'default host'; // ... }
ES6 以上的版本写起来就更方便了,但是缺少类型断言:
const foo = (arg1, arg2 = 'default host', arg3) => { }
Ts 则有类型断言,可以在编译时发现错误:
const foo = (arg1:number, arg2?:string = 'default host', arg3?:any): void => { }
支持 0 反对 0 举报2021-11-26 02:25
-
const npmArgs = process.argv.slice(2), paramsMap = Object.assign( { host: 'fl.zh', host2: 'fl.cs' }, npmArgs && npmArgs[0] && require('minimist')(npmArgs) || {} ); module.exports = { NODE_ENV: '"cus"', BASE_URL: '"//' + paramsMap.host + '"', }
浅层object合并可以考虑用assign设置默认值
支持 0 反对 0 举报2021-11-26 03:59
-
const arg1 = nameArgs[0] ? nameArgs[0] : '默认值' const arg2 = nameArgs[1] ? nameArgs[0] : '默认值' const arg3 = nameArgs[2] ? nameArgs[0] : '默认值'
支持 0 反对 0 举报2021-11-26 04:35
-
拆分成函数
const npmArgs = procces.argv.slice(2) const HOST = npmArgs.length > 0 ? getHost(npmArgs) : 'fl.zh' const getHost = function(args) { let minimist = require('minimist') let newArgs = minimist(args) return newArgs.host }
支持 0 反对 0 举报2021-11-26 05:52
-
谢谢大家踊跃发言,我自己写了一个paramMap,大家看看有木有问题?
目前是实现了需求,o( ̄︶ ̄)o 当然,大家的意见我会挨个挨个的查看,参考,评价'use strict' const npmArgs = process.argv.slice(2) //低仿patch const paramsMap = { host: 'fl.zh', host2: 'fl.cs' } var HOST var HOST2 if (!npmArgs) { HOST = paramsMap.host; HOST2 = paramsMap.host2; console.log(`项目正常打包地址:${HOST}`) } else { var minimist = require('minimist'); var args = minimist(npmArgs); HOST = args.host || paramsMap.host HOST2 = args.host2 || paramsMap.host2 console.log(`HOST:${HOST},HOST2:${HOST2}`); } module.exports = { NODE_ENV: '"cus"', BASE_URL: '"//' + HOST + '"', }
运行命名后process.env.argv数据如下
支持 0 反对 0 举报2021-11-26 05:58