【问题标题】:How to pass the value 'undefined' to a function with multiple parameters?如何将值“未定义”传递给具有多个参数的函数?
【发布时间】:2012-02-18 09:28:49
【问题描述】:

我想在多参数函数上传递 'undefined' 的值,但不省略参数。

“不省略参数”是什么意思。我的意思是我们不应该像这个例子一样省略parm2

function myFunction (parm1, parm2) {}
myFunction("abc");

这确实会使parm2未定义,但是我不允许这样做,因为我需要在省略的参数之后指定其他参数,所以前面的方法在我想要的情况下不起作用parm1 undefined BUT 还希望在此参数之后有其他参数来保存值。

我已尝试通过以下方式解决问题:

myFunction( ,"abc"); //doesn't seem to work

更新:

myFunction(undefined, "abc"); « 这现在可靠地工作了。

不过,值得一提的是:

将变量设置为undefined 被认为是一种不好的做法,我们 应该改用null

【问题讨论】:

    标签: javascript function parameter-passing undefined


    【解决方案1】:

    myFunction(undefined,"abc");这种方式应该可以,有什么问题?

    here

    Here is undefined documentation 来自 mozilla,所有浏览器都支持

    【讨论】:

    • 为什么 undefined 不可写会有所不同?这不会影响将其传递给函数。
    • @TedBigham 它不可写意味着它不能被设置为代码中以前某处的值,这意味着(基于规范)它应该始终被视为未定义
    • @BrianLeishman 我同意你不能为 undefined 关键字赋值,但这应该不会影响将它作为参数传递给函数。
    • @TedBigham 我认为关键是您可以安全地使用它。例如,我可以将 kfdjhsdfgsdf 传递给一个函数,因为它可能尚未定义,但如果与未定义的概念一起使用,它可能具有值并且可能会产生意外结果,而 @987654326 @ 不能设置,不应该有意外的结果
    • 将变量设置为undefined 被认为是不好的做法。您应该传递一个null 值。更多信息What is the difference between null and undefined in JavaScript?
    【解决方案2】:

    void operator 似乎是显式获取undefined 的最常用方式。

    你会在你的例子中这样使用它:

    myFunction(void 0, "abc");
    

    这也是一种比较 undefined 的可靠方法,可以防止 undefined 在旧 JavaScript 环境中被意外覆盖:

    var x;
    if (x === void 0) {
        // this will execute
    }
    

    【讨论】:

      【解决方案3】:

      更好的方法可能是传递带有命名属性的Object,然后查找那些特定的属性值。这样您就不必依赖于参数的数量。
      示例:Object.dummy

      【讨论】:

      • +1 表示可以重写相关函数。
      • 这不是一个坏建议,但建议这是总是更好的方法有点自大,它实际上并没有回答问题。
      • 没有人说它总是更好。我看不出你对答案有什么傲慢,这只是另一种传递参数的方法,避免了位置参数的问题。
      • 传统的函数参数更习惯。
      • 通过一个小例子来说明如何做到这一点,这将是一个非常好的答案。
      【解决方案4】:

      我刚刚有了一个想法,它似乎奏效了:

      var undf;
      
      myFunction(undf, "abc");
      

      我确信有更好的方法,但是我发布了这个

      【讨论】:

        【解决方案5】:

        您需要通过以下方式之一在函数代码本身中处理带有未定义变量的函数调用:-

         function myFunction (parm1, parm2) {
        
                 if (parm1 !== undefined) {
                     // execute code if 1st param is undefined
                }
        
                 if (parm2 !== undefined) {
                     // execute code if 2 param is undefined
                }
        
                // execute other part of code
        
            }
        

        现在您可以通过以下方式调用上述函数:-

        myFunction(undefined,"abc"); // with 1st param value not known
        
        myFunction("cde",undefined); // with 2nd param value not known
        
        myFunction("cde","abc");  // with both param value known
        

        【讨论】:

          【解决方案6】:

          我认为最接近这一点的方法是将null 作为参数传递。不是undefined,但在大多数情况下,它已经足够接近了。

          【讨论】:

          • typeof null == "object" 这是相当误导。
          • @TomášZato null === null,这完全没有误导
          • @BradenBest 我认为 Tomáš Zato 的观点是现在需要执行另一个条件检查,而不是仅仅依赖 typeof。我个人觉得这很烦人。
          【解决方案7】:

          如果您打算添加不定数量的参数,请尝试使用此方法:

          function myFunc(params) {
              // Define default values
              var name = 'John';
              var age = '40';
              // You can loop through them
              for (var p in params) {
                  alert(p + ':' + params[p]);
              }
              // And read them in like this
              if (typeof params.name != 'undefined') {
                  name = params.name;
              }
              if (typeof params.age != 'undefined') {
                  age = params.age;
              }
              alert(name + ' ' + age);
          }
          
          alert('test1');
          myFunc({name:'Bob', age:'30'});
          alert('test2');
          myFunc({name:'Bob'});
          

          【讨论】:

            【解决方案8】:

            如果可能的话,您能否将函数重新排列为 myFunction (parm2, parm1)

            即。尽量确保可能的未定义参数在函数中最后,如果引入更多参数,这可能不起作用。

            【讨论】:

              【解决方案9】:

              您可以使用apply 和一个参数数组来传递“未定义”作为参数之一。例如,您想将 parm1 作为“未定义”传递:

              function myFunction (parm1, parm2) {
              
                  if(typeof (parm1) === "undefined"){
                      alert("parm1 is undefined")
                  }
              
                  if(typeof (parm2) === "undefined"){
                      alert("parm2 is undefined")
                  }
              
              }
              
              var myParameters = [undefined, "abc"];
              
              myFunction.apply(valueForThis, myParameters );
              

              【讨论】:

                【解决方案10】:

                myFunction(undefined,"abc") 绝对可以工作,除非有人残忍重新定义 undefined!如果你想安全起见,有很多方法可以获得未定义的值,从而避免假设所谓的“未定义”实际上确实具有特殊的未定义值:

                void 0
                var undef; undef
                [][0]
                {}.foo
                // `undef` is guaranteed to have the undefined value within this closure
                (function(undef){ undef }())
                // this expression evaluates as undefined
                (function(){}())
                

                void 0 是使用最广泛的(编译后的 CoffeeScript 在需要未定义值的地方包括此)。

                【讨论】:

                • 很高兴知道这一点,尽管我们将在相当长的一段时间内支持较旧的 JavaScript 引擎。
                • 迟到的评论,但对于其他阅读这篇文章的人来说:不可写与将undefined 直接传递给函数的能力完全无关。虽然undefined 肯定是不可写的,但它与这个问题无关。
                【解决方案11】:

                在可接受的情况下,一个简单的方法是传递 undefined。但更好的是按照W3C

                Javascript-missing arguments

                function myFunction(x, y) {
                if (y === undefined) {
                      y = 0;
                    } 
                }
                

                【讨论】:

                  【解决方案12】:

                  只是举例说明@dbrin 的解释,@alphapilgrim 可能希望检查一下。

                  simpleFunction({params1:12, params2:"abc"}); //use expected arguments
                  simpleFunction({params2:"abc"}); //use only one
                  simpleFunction({params2:"abc", params1:12, iDoNotExist:"I will not be included"}); //use expected arguments in any order
                  simpleFunction(); //ignore arguments and uses defaults
                  simpleFunction(2123); //ignores non object arguments 
                  
                  function simpleFunction(someParams){
                    var myParams = {
                      params1:null,
                      params2:"cde" //default value for second parameter
                    };
                    simpleExtend(myParams, someParams);
                    
                    console.log(myParams);
                  
                  }
                  
                  
                  //to include in your utilities
                  function simpleExtend(currentParams, newParams){
                    
                    if(typeof currentParams !== "undefined" && typeof newParams !== "undefined"){
                      Object.keys(newParams).forEach(function(key){
                     
                        if(typeof currentParams[key] !== "undefined"){
                          currentParams[key] = newParams[key];    
                        }
                  
                      });
                   
                    
                    }
                    
                   
                  
                  }

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-06-22
                    • 2015-09-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-04-04
                    • 1970-01-01
                    • 2016-04-02
                    相关资源
                    最近更新 更多