【问题标题】:checking the existence of multiple arguments in an elegant manner以优雅的方式检查多个参数的存在
【发布时间】:2012-01-26 16:40:02
【问题描述】:

我有一个这样的功能 -

var myFunction  = function(arg1, arg2, arg3, arg4, arg5, arg6, arg7){
    if(typeof arg1 != 'undefined' && typeof arg2 attributeId != 'undefined' && typeof arg3 != 'undefined'){ //and so on for all the arguments
    //do something with all of the arguments
    }
}

基本上,我会在做某事之前检查所有 7 个参数是否都存在。

这看起来很难看,不可读。你能提出一种更优雅的方式来实现同样的目标吗?

【问题讨论】:

    标签: javascript function methods


    【解决方案1】:

    可以使用arguments 变量来确定传递了多少参数

    if (arguments.length !== 7) {
      ...
    }
    

    但是,这仍然不会告诉您所有这些都是已定义的值。为了确定它们是否都已定义,您必须单独检查它们,因为在参数列表中间传递 undefined 是合法的

    myFunction(1, 2, undefined, 4, 5, 6, 7);
    

    可能最好的方法是将其抽象为一个单独的函数

    var allDefined = function(args) {
      var i = 0;
      for (i = 0; i < args.length; i++) {
        if (typeof args[i] === 'undefined') {
          return false;
        }
      }
      return true;
    }
    
    var myFunction  = function(arg1, arg2, arg3, arg4, arg5, arg6, arg7) {
      if (arguments.length === 7 && allDefined(arguments)) {
        // They're all there
      }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用arguments.length 来获取实际传递的参数数量。

      arguments 是一个“类似数组”的内置函数。如果你想测试参数是否有值,只需像对任何数组一样循环它。 (当然,您可能认为框架中的“查询”方法更优雅,但最终,有人在循环。)

      【讨论】:

        【解决方案3】:

        每个函数都可以访问arguments 伪数组,其中包含所有传入的参数。

        如果你想确保你有 7 个非空参数,那么检查应该是这样的:

        if (arguments.length != 7 || ![].slice.call(arguments, 0, 7).every(
               function(val) { return val != null; })) {
        
               alert("Please pass 7 good arguments");
               return;
        }
        

        DEMO

        (为了支持较旧的浏览器,您需要为 every 方法获取 shim,由于某种原因我在 MDN 上没有看到)

        【讨论】:

          【解决方案4】:
          var myFunction= function(){
              var i= 7, a= arguments;
              while(i){
                  if(a[--i]== undefined) return new Error('Expected 7 arguments')
              }
              return a.length;
              //the first 7 arguments are not null or undefined
              // they could be false, '', 0 or NaN
          }
          myFunction(1, 2, 3, 4, 5, '', 7)
          /*  returned value: (Number)
          7
          */
          myFunction(1, 2, 3, 4, 5, null, 7)
          
          /*  returned value: (Error)
          Error: Expected 7 arguments
          */
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-17
            • 1970-01-01
            • 1970-01-01
            • 2015-06-10
            • 2019-12-12
            • 2019-05-09
            • 1970-01-01
            • 2020-08-11
            相关资源
            最近更新 更多