Turn an IF-ELSE statement into a one liner without using a ternary operator
We all know about the ternary operator, I'm not talking about it. I'm talking about dealing with something like this:
if(Array.isArray(mixedVariable)) {
mixedVariable[idx] = value;
} else if(!NaN(mixedVariable)) {
mixedVariable = value + 10;
} else {
mixedVariable = value;
}
In that case, a ternary operator is not enough. But we can also turn it into
((mixedVariable[idx] = value) && Array.isArray(mixedVariable)) || ((mixedVariable = value+10) && !isNaN(mixedVariable)) || (mixedVariable = value)
Having the assignments surrounded by parenthesis is crucial, otherwise you'll end up having a boolean value on the first two cases.
Disclaimer
It might be helpful in some cases to simplify some statements and in some other cases it might be a very bad idea to write your code this way. Left to the developer's discretion.
Written by Fernando Doglio
Related protips
7 Responses
The one-liner example you provided is too cryptic and unreliable, I would prefer the first code block in this case. I like using logical operands for quick short conditionals but I rarely go beyond something like
someCondition && doActionIfTrue();
anotherCondition || doActionIfFalse();
I came up with the following rules of thumb in that area:
-
Never use assignments in conditionals (even in a regular
if
-block). They are easy to overlook, besides you have to enclose them in extra parentheses if you want to use them in a one-liner (looks a bit messy) - Don't use more than 1-2 actions in a logical one-liner
(
someCondition && doActionIfTrue();
) - If you want an
if-else
one-liner substitute, it's better to use the ternary operator instead if&&
and||
, especially if you want to assign assign the result of the expression to a variable. E.g.x = condition ? method1() : method2()
is shorter and also more robust thanx = condition && method1() || method2()
, because in the second case you won't get the intended result if condition istrue
and method1 returnsfalse
- Sometimes it's OK to nest ternary operators but not deeper than 2 levels (and definitely break it into several lines with nice formatting)
- Finally, clarity is more important than brevity. Please don't write one-liners like in the original example.
Thanks for your comments, I appreciate your input and I do agree with you in all of those points, but I have come to use this in some cases, so I thought I'd share it here.
That's not a good example, while simple examples such as dpashkevich pointed out can improve readability example you provide doesn't. And on top of that it makes code harder to modify and refactor.
Never say never, re-assignment in conditionals is a fairly popular and general practice.
Thanks, finally someone said the magic words... "never say never", that's the whole point of this pro-tip..
'cause fuck readability, that's why
Indeed :)