我是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);
}
答案 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。
正确的片段是第二个。