Javascript 如何传递值';未定义';对于具有多个参数的函数?

Javascript 如何传递值';未定义';对于具有多个参数的函数?,javascript,function,parameter-passing,undefined,Javascript,Function,Parameter Passing,Undefined,我想在多参数函数上传递'undefined'的值,但不忽略参数 “不省略参数”是什么意思。我的意思是,我们不应该像下面的例子那样省略parm2: function myFunction (parm1, parm2) {} myFunction("abc"); 这确实会使parm2未定义,但我不允许这样做,因为我需要在省略的参数之后指定其他参数,因此前面的方法在我希望使parm1未定义但还希望在此参数之后有其他参数来保存值的情况下不起作用 我已尝试通过以下方式解决该问题: myFunction(

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

“不省略参数”是什么意思。我的意思是,我们不应该像下面的例子那样省略
parm2

function myFunction (parm1, parm2) {}
myFunction("abc");
这确实会使
parm2
未定义,但我不允许这样做,因为我需要在省略的参数之后指定其他参数,因此前面的方法在我希望使
parm1
未定义但还希望在此参数之后有其他参数来保存值的情况下不起作用

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

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

更新:

myFunction(未定义的“abc”)«现在可以可靠地工作了

然而,值得一提的是:


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


我认为最接近于此的方法是将
null
作为参数传递。它不是未定义的,但在大多数情况下,它已经足够接近了。

我刚刚有了一个想法,它似乎起了作用:

var undf;

myFunction(undf, "abc");

我确信有更好的方法,但是我发布了这个一个更好的方法可能是传递带有命名属性的
对象
,然后查找那些特定的属性值。这样,您就不必依赖于参数的数量。
示例:
Object.dummy
myFunction(未定义的“abc”)这种方式应该有效,有什么问题吗


来自mozilla,所有浏览器都支持

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

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'});
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在需要未定义值的地方包含此函数)。

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

ie.尝试确保可能未定义的参数是函数中的最后一个,如果引入更多参数,这可能不起作用。

似乎是显式获取
未定义的
的最常用方法

您可以在示例中这样使用它:

myFunction(void 0, "abc");
它也是比较
未定义
的可靠方法,可以防止
未定义
在较旧的JavaScript环境中被意外覆盖:

var x;
if (x === void 0) {
    // this will execute
}
可以使用和参数数组将“undefined”作为参数之一传递。例如,您希望将parm1传递为“未定义”:


在可接受的情况下,一种简单的方法是通过未定义。但更好的是如下所示:


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

simpleFunction({params1:12,params2:“abc”})//使用预期参数
simpleFunction({params2:“abc”})//只使用一个
simpleFunction({params2:“abc”,params1:12,idonnotexist:“我将不被包括”})//按任意顺序使用预期参数
simpleFunction()//忽略参数并使用默认值
简单函数(2123)//忽略非对象参数
函数simpleFunction(someParams){
var myParams={
params1:null,
params2:“cde”//第二个参数的默认值
};
simpleExtend(myParams,someParams);
console.log(myParams);
}
//包括在您的实用程序中
函数simpleExtend(currentParams,newParams){
if(当前参数的类型!=“未定义”&&typeof newParams!=“未定义”){
Object.keys(newParams).forEach(函数(key){
if(当前参数的类型[键]!=“未定义”){
currentParams[key]=newParams[key];
}
});
}

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

 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

+1建议可以重写所讨论的函数。这不是一个坏建议,但认为这始终是一个更好的方法有点自大,实际上它并没有回答问题。没有人说它总是更好。我看不出你对这个答案有什么傲慢的地方,这只是传递参数的另一种方式,可以避免位置参数的问题。传统的函数参数更容易习惯。通过一个小例子说明如何做到这一点,这将是一个非常好的答案。很高兴知道,虽然我们将在相当长的一段时间内支持较旧的JavaScript引擎。请稍后评论,但对于阅读本文的其他人来说:不可写与将
未定义的
直接传递给函数的能力完全无关。虽然
undefined
当然是不可写的,但它与这个问题无关。
typeof null==“object”
这是非常误导人的。@TomášZato
null===null
,这在当时并不误导人all@BradenBest我认为TomášZato的观点是,现在需要执行另一个条件检查,而不是仅仅依靠
typeof
。我个人觉得这很烦人。为什么未定义的不可写会有不同?这并不影响将其传递到函数中。@TedBigham它不可写意味着不能将其设置为代码中以前某个位置的值,这意味着(根据规范)应始终考虑它undefined@BrianLeishman我同意你不能给未定义的关键字赋值,但这对将其作为参数传递给函数没有影响。@TedBigham我认为关键是您可以安全地使用它。例如,我可以将
kfdjhsdfgsdf
传递给函数,因为它可能
 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