如何在JavaScript中将传递给函数的变量设置为null

8
假设我有一个 JavaScript 函数:
function something (variable) {
    console.log(variable);
}

如何设置默认为null,如果没有传递变量?

3
如果它没有被传递,它的值将是未定义的。你确切地需要一个空值(null)吗? - Mitya
6个回答

7

当你调用一个函数时,JavaScript对于所需的函数参数数量并不特别挑剔。在声明中提到但未传递的任何参数将被设置为类型undefined

比如:

function test(foo)
{
    console.log(foo === undefined); // true
}

设置默认值至少有三种选项:

function test(foo)
{
    console.log(foo || 'default value');
}

如果foo的值为真,那么上述代码将输出foo的值,否则输出'default value'
function test(foo)
{
    console.log(foo === undefined ? foo : 'default value');
}

如果foo的值不是undefined,则输出它的值,否则输出'default value'
最后,您可以计算传递的参数数量:
function test(foo)
{
    console.log(arguments.length > 0 ? foo : 'default value');
}

这将输出foo的值(无论其类型)如果有参数被传递。
进一步考虑:
尽管自ES5以来,undefined不可写的,但并非所有浏览器都会如此警惕地执行此操作。如果您担心此问题,有两个替代方案可供使用:
foo === void 0;
typeof foo === 'undefined'; // also works for undeclared variables

2

从技术上讲,这个答案没有问题,但是当传递两个参数、三个参数或四个参数时会发生什么... - user1037355
@John 可以使用 arguments 来处理任意数量的参数,并根据 arguments 对象中的状态和位置进行决策,而不考虑变量的名称。你能否详细说明一下你的想法?也许我没有理解你的意思。 - melc
@John 例如,arguments [0] 对应于 variable1arguments [1] 对应于 variable2argument [N-1] 对应于 variableN,以便检查它们是否为“null”或其他内容。此外,argument.length === N-1 意味着 variableN 没有被传递。 - melc
http://jsfiddle.net/7fJp3/ 我没想到参数可以这样使用.. 我以为参数必须本质上是一个数字数组。 - user1037355

2
它应该很简单,就像:
function something (variable) {
    console.log(variable || null);
}

通常,您可以像这样为参数分配默认值:
function something (somevar1, somevar2 /* ... somevarn */) {
    somevar1 = somevar1 || 'somevar1 not present';
    somevar1 = somevar2 || 2;
    somevar3 = somevar3 || {foo: 'bar', foobar: null}
    /* etc. */
}

或者,如果您需要防御 0false 等(并为 @Ketola 提供服务),您可以想出以下内容:
function something (somevar1) {
    somevar1 = ['', 0, false, null, undefined].indexOf(somevar1) > -1
               && null || somevar1;
}

"...这 || 那"被称为短路求值

这仅适用于计算结果为“true”的变量。something(0,false)将无法按预期工作。 - Ketola
OP问道:“如果没有传递变量,如何设置...” - KooiInc
2
是的,但这仍然不起作用。如果传递“false”或0,则variable || null将计算为null。 - Ketola
如果传递了 false0,则会传递 something,尽管它评估为 null。 - KooiInc
3
如果没有传入变量,则如何将其默认设置为null?如果变量已定义,则解决方案不应将变量设置为null - Ketola

2
所有上述方法都可以确保有效,但这是最简单的方法,我也使用这种方法最多。
variable = variable ? variable : undefined; // you can use null as well

这并不是功能上等价的。typeof x === 'undefined' 更加具体,因为它仅检查 falsiness;0'' 和其他值 也是 falsey。 - yerforkferchips

1

像这样测试您的变量值:

function something (variable) {
    variable = (typeof variable !== 'undefined') ? variable : null;
}

抱歉,我没有注意到我没有编辑自己的答案。 - KooiInc

1
或者更友好(依我之见)的选择是:

function getProfile( singleVariable )
{
    singleVariable = singleVariable || false;
    if (singleVariable) {
        alert('we have a var')
    }
    else {
        alert('nothing opassed');
    }
}
getProfile();
getProfile('tom');

当你开始传递大量参数,但希望函数具有灵活性时,可以这样做:

function getProfile(params)
{
    params = params || {};

    if (params.username) {
        alert(params.username)
    }
    if (params.id) {
      alert(params.id);
    }
}
getProfile();
getProfile({username:'tom', id: 123654987});

代替之:
function getProfile(singleVariable, otherVar, othervar2)
{
    singleVariable = singleVariable || false;
    otherVar = otherVar|| false;
    otherVar2 = singleVariable2 || false;

    if( singleVariable ){
        alert('we have a var')
    }
    else {
        alert('nothing opassed');
    }
}

getProfile('tom', false, 'smith');

那个 false 是必需的,而且很烦人... 传递一个对象会更加高效。


谢谢,@John - 如果我传递类似getProfile('tom', 'smith')这样的东西 - 那么函数会假定othervar2是null?还是false?还是undefined? - Aerodynamika
未定义。然而,我强烈建议不要使用这种方法。随着您的应用程序增长,以这种方式传递参数的管理变得非常困难。 - user1037355
事实上,任何半靠谱的第三方插件都会期望你传递一个数组(对象)给它。例如:$.ajax({url:'www.blah',type:'GET',success:function(data){alert(data);}}) 此外,由于你传递的是一个关联数组,所以你传递参数的顺序是无关紧要的。 - user1037355
1
如果 singleVariable 是一个假值,但你故意传递了一个值,那么这个解决方案将会产生错误的负面结果。 - dee-see
|| false 不会影响程序的行为;如果删除那一行,函数仍然可以正常工作。 - user2357112

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