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

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

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

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

image.png

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

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

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

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

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

大佬们给点意见

已解决 悬赏分:40 - 解决时间 2021-11-26 12:09
反对 0举报 0 收藏 0

回答6

最佳
  • @

    一些个人见解:

    1. 函数定义的时候把参数按重要性排列;
    2. 采用三目运算符或者 ‘||’ 运算符对参数设置默认值;
    3. 使用 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数据如下
    image.png

    支持 0 反对 0 举报
    2021-11-26 05:58
  • @

    随便找个库不就好了
    https://www.npmjs.com/package/minimist

    支持 0 反对 0 举报
    2021-11-26 06:59