||
. Now, you might be wondering, "what's so bad about it?" Well, nothing. It's just bad programmers using it incorrectly.The
||
operator is used in JavaScript not only to describe a disjunction, but also to specify default parameters to a function. (It's used in place of default parameter assignment, i.e. the one in function foo(bar=5){}
, setting bar
to 5.) It might be used (correctly) in the following situation:
function add(x, y, z){
z = z || 0;
return x + y + z;
}
This function successfully does what it's supposed to: add x
and y
, and z
if specified. This works because of the short-circuiting property of ||
. This operator is roughly equivalent to the following function:
function disjunction(LHS, RHS){
if(LHS){
return LHS;
} else {
return RHS;
}
}
In this case, when the LHS
is undefined, the value of the expression is RHS
. However, the obverse of the statement (i.e. when LHS
is defined then the value is not RHS
and is thus is LHS
) does not hold. Observe:
function multiply(x, y, z){
z = z || 1;
return x * y * z;
}
This works for most testcases (try it yourself) except for when z === 0
; the expected result is 0
, but what we get is x * y
. Why? Well, let's look at what the disjunction yields. z = z || 1
becomes z = 0 || 1
, which becomes z = 1
, the incorrect result. This is why I follow this rule: when the RHS to the disjunction is truthy, use typeof z === "undefined" ? default : z
; otherwise, one can use ||
.
No comments:
Post a Comment