可选参数和默认值

时间:2014-04-29 15:45:58

标签: javascript

我是javascript的新手,以下两个函数做同样的事情,你会选择一个吗?

var multiply = function(arg1, arg2) {
             arg1 && (arg1 = 0);
             arg2 && (arg2 = 0);
             return arg1*arg2;
          }


var multiply = function(arg1, arg2) {
             arg1 = arg1 || 0;
             arg2 = arg2 || 0;
             return arg1*arg2;
          }

我问的原因是我第一次看到这样的事情

  function(path, limit) {
     var ref = firebaseRef(path);
     limit && (ref = ref.limit(limit)); //if i understood correctly this line does an assignment based on condition without an if statement
     return $firebase(ref);
  }

3 个答案:

答案 0 :(得分:2)

function(path, limit) {
    var ref = firebaseRef(path);
    limit && (ref = ref.limit(limit));   // Important
    return $firebase(ref);
}

重要的一行,可以这样写成

if (limit) {
    ref = ref.limit(limit);
}

但如果你想像第一种方式一样写,那就完成了,

ref = limit && ref.limit(limit)

这有一个问题,当limit为Falsy时&&会立即返回已评估的Falsy值limit,因此ref现在是Falsy。我相信你不会想要这个。

在一天结束时,作为程序员,我们编写的代码代码的可读性和可维护性很重要。因此,我建议使用明确的if检查,我在答案开头提到了这一点。

注意:另外,正如其他人所说,第一个multiply应该是这样的

var multiply = function(arg1, arg2) {
    arg1 || (arg1 = 0);
    arg2 || (arg2 = 0);
    return arg1 * arg2;
}

更好的是,我会像这样写出来

var multiply = function(arg1, arg2) {
    return (arg1 || 0) * (arg2 || 0);
}

答案 1 :(得分:1)

两者都是变量赋值,它们对逻辑运算的评估方式不同。

例如 expr1&&如果expr1返回expr1,则expr2 将返回false,否则变量赋值将评估为第二个表达式(即expr2)。

如果评估为expr1,则使用逻辑或操作将返回true,否则将返回expr2

请考虑以下事项:

// Logical AND
var a1 =  true && true;     // t && t returns true
var a2 =  true && false;    // t && f returns false
var a3 = false && true;     // f && t returns false
var a4 = false && (3 == 4); // f && f returns false
var a5 = "Cat" && "Dog";    // t && t returns Dog
var a6 = false && "Cat";    // f && t returns false
var a7 = "Cat" && false;    // t && f returns false

// Logical OR
var o1 =  true || true;     // t || t returns true
var o2 = false || true;     // f || t returns true
var o3 =  true || false;    // t || f returns true
var o4 = false || (3 == 4); // f || f returns false
var o5 = "Cat" || "Dog";    // t || t returns Cat
var o6 = false || "Cat";    // f || t returns Cat
var o7 = "Cat" || false;    // t || f returns Cat

有关详细信息,请参阅:Mozilla Developer Network on Logical Operator Expressions

答案 2 :(得分:1)

我认为第一个实际上会与你想要的相反。让我们在几个案例中对此进行测试:

arg1 && (arg1 = 0);

如果arg1为0或任何其他假值,则执行如下:
0(表示错误)和作业。表达式将立即返回false而不执行arg1 = 0语句,因为false || (t/f)始终返回false。

如果arg1为1,或任何其他真实价值,那么我们有:

1(意思是真实)和一项任务。分配此次运行,因为它必须查看第二个条件返回的内容。因此,arg1将设置为0。

正确的片段是第二个。