javascrip如何实现参数的优雅传递

js怎么优雅的实现参数的传递覆盖?

类似于patch请求,我传递了值的参数就覆盖,没有传递值就默认.

目前写的是ifelse判断 感觉太僵硬了

image.png

现在的条件判断是 :当前不传参 就给HOST默认值

传参(hsot),就把host赋值给HOST

设想一种情况:要传多个参数值:arg1,arg2,arg3

arg1,arg2我传了值,arg3没传递,按照现在的ifelse逻辑就会报错

怎么优雅的实现参数赋值?

大佬们给点意见

阅读 3.7k
6 个回答

一些个人见解:

  1. 函数定义的时候把参数按重要性排列;
  2. 采用三目运算符或者 ‘||’ 运算符对参数设置默认值;
  3. 使用 ES6+ 或者 TypeScript。

ES5 版本类似于:

/**
 * ...
 * param {Number} arg1
 * param {String|Any} [arg2 = 'default host']
 * param {Number|Any} [arg3]
 *
 * @throw {InvalidArgumentException} - Will throw an error if arg1 is not typeof **Number**.
 */
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 => {
}
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设置默认值

const arg1 = nameArgs[0] ? nameArgs[0] : '默认值'
const arg2 = nameArgs[1] ? nameArgs[0] : '默认值'
const arg3 = nameArgs[2] ? nameArgs[0] : '默认值'

拆分成函数

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
    }

谢谢大家踊跃发言,我自己写了一个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数据如下
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题