我可以一直使用`||`来分配默认参数值吗?

时间:2015-01-31 15:49:25

标签: javascript operators default-parameters

可选参数

我经常使用带有可选参数的JavaScript函数。 而不是写这样的长支票:

if(param === null || param === undefined){ 
    param = {};
}

我通常使用以下语法:

function doSomething(optionalParam, optionalCallback, optionalFlag){
    optionalParam = optionalParam || {};
    optionalParam["xyz"] = "value";    //Won't fail if the user didn't pass a value

    optionalCallback = optionalCallback || function(){};
    optionalCallback();        //If I need the function on 20 places, I don't have to insert a typeof-check everywhere

    optionalFlag = optionalFlag || false;
}

优点很明显,我可以处理undefinednull参数。

但是,这对于默认为true的可选标志不起作用:

someFlag = someFlag || true; //Will never evaluate to false.

返回值

这是我使用该语法的另一个例子:

function getValueOfIndex(idx){
    return anArray[idx] || null;  //Returns null if the index is out of bounds
}

我的问题:

||运算符如何在我的用例中工作?

  • 我可以在所有这些情况下使用||吗?
  • 有没有理由不使用它?
  • 是否存在此语法失败的其他类型或值?

修改:我认识到我的最后一点(null||undefinedundefined||null之间的差异)应该属于一个单独的问题,所以我将其删除了。

3 个答案:

答案 0 :(得分:2)

一般的答案是你不能使用

parameter = parameter || default;

如果用户应该能够传递一个假的参数,那么该参数应该优先于默认参数。在这种情况下,您需要明确测试undefined

parameter = typeof parameter == "undefined" ? default : parameter;

如果用户应该能够传递显式undefined值并且优先级(这是一个非常有悖常规的事情),那么您需要测试arguments.length以确定有多少参数传递,所以你只能默认余数。

答案 1 :(得分:1)

为什么以下两个表达式会返回不同的值?

  • null || undefined //求值为undefined
  • undefined || null //求值为null

某事|| somethingElse是一个表达式,意味着总是返回一个值,或者是第一个值,否则就是最后一个值。例如false || 17是17. null和undefined都是假的,因此在两种情况下都是||将返回最后一个值。

我可以使用||对于所有这些情况?

||有时可以做一些你不会期待的事情

function thisIsUnexpected (a) {
    a = a || "other value";
    reurn a;
}

thisIsUnexpected(); // will return "other value";
// it can fail when you pass in a falsy value
thisIsUnexpected(false); // you would want it to return false, yet it will return "other value"

要获得正确的行为,您需要使用如下的三元表达式。这绝不会失败。

function thisIsExpected (a) {
    a = (a === undefined) ? "other value" : a;
    reurn a;
}

答案 2 :(得分:1)

逻辑OR运算符可以用,只要用于测试参数存在的表达式对于提供参数的所有情况都返回true

someFlag = someFlag || true; //Will never evaluate to false.

上面的示例不起作用,因为我可以提供参数false,并且用于测试参数是否存在的表达式(在这种情况下只是someFlag)仍将评估为false,暗示没有指定参数。

因此您需要将代码修改为:

someFlag = (typeof someFlag === 'boolean') ? someFlag : true;