如何将值“undefined”传递给具有多个参数的函数?

50
我想在多参数函数中传递“undefined”的值,但不希望省略该参数。
当我说“不要省略参数”是什么意思?我的意思是我们不应该像这个例子一样省略parm2
function myFunction (parm1, parm2) {}
myFunction("abc");

这确实会使parm2未定义,但我不能这样做,因为我需要在省略参数之后指定其他参数,所以在我想让parm1未定义,但仍想在此参数后有其他参数保持值的情况下,先前的方法将无法使用。
我已尝试通过以下方式解决问题:
myFunction( ,"abc"); //doesn't seem to work

更新:

现在 myFunction(undefined, "abc"); 可以正常工作了。

然而,值得一提的是:

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

12个回答

68

为什么未定义的变量不可写会有影响?这并不影响将其传递到函数中。 - Ted Bigham
@TedBigham,它不可写意味着它不能在代码的先前某个位置设置为一个值,这意味着(根据规范)它应该始终被视为未定义。 - Brian Leishman
@BrianLeishman 我同意你不能给未定义的关键字赋值,但这对将其作为参数传递给函数没有影响。 - Ted Bigham
@TedBigham 我认为重点是你可以安全地使用它。例如,我可以将 kfdjhsdfgsdf 传递给一个函数,因为它可能还没有被定义,但是如果在未定义的情况下使用它,可能会产生意外结果,因为它可能已经有了值,而 undefined 不能被设置,也不应该产生意外结果。 - Brian Leishman
5
将一个变量设置为 undefined 被认为是一种不良实践,应该传递一个 null 值。更多信息请参见JavaScript 中 null 和 undefined 的区别是什么? - Carlos Morales

15
void 运算符 似乎是显式获取 undefined 最常见的方式。
在您的示例中,您可以这样使用它:
myFunction(void 0, "abc");

这也是一种可靠的方法,用于与undefined进行比较,并防止在旧的JavaScript环境中意外覆盖undefined

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

12

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


2
建议重新编写相关函数,给予+1鼓励。 - davidchambers
6
这个建议并不坏,但是认为这总是更好的方法有点傲慢,而且它实际上并没有回答问题。 - Jonathan Hall
2
没有人说一直都是更好的。我不明白你为什么认为这个答案很傲慢,它只是另一种传递参数的方式,避免了位置参数的问题。 - dbrin
如果能附上一个小例子来说明如何实现这个功能,那就更好了。 - alphapilgrim
这真是个天才的想法,为什么我从来没有想到过。感谢@dbrin。 - Backer
显示剩余4条评论

3

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

 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

3

我刚有了一个想法,看起来可以行得通:

var undf;

myFunction(undf, "abc");

我相信有更好的方法,但是我现在发布这个


2

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


1
typeof null == "object" 这个表达方式非常误导人。 - Tomáš Zato
@TomášZato null === null,这一点毫不含糊,一点也不会误导。 - Braden Best
@BradenBest 我认为Tomáš Zato的观点是现在需要执行另一个条件检查,而不仅仅依赖于typeof。我个人觉得这很烦人。 - Dejay Clayton

1

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

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'});

1
如果可能的话,你能将函数重排成myFunction(parm2, parm1)的形式吗?尽量确保可能为undefined的参数在函数末尾,如果引入更多参数,则这可能无效。

1

您可以使用apply和参数数组将"undefined"作为其中一个参数传递。例如,如果您想将parm1作为"undefined"传递:

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 );

0

myFunction(undefined,"abc") 应该绝对可行,除非有人残忍地重新定义了 undefined!如果您想要安全起见,有许多方法可以获取未定义的值,避免假设称为“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 在需要 undefined 值时都会包含它)。


这是一个好消息,尽管我们将在相当长的一段时间内支持旧的JavaScript引擎。 - davidchambers
1
晚了点评论,但是对于其他人来说:不可写与直接传递 undefined 到函数的能力完全无关。虽然 undefined 显然是不可写的,但它与这个问题无关。 - michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接