DEV Community

Shreyas Minocha
Shreyas Minocha

Posted on

What do you think about the ternary operator?

Shortcuts

The ternary operator has a reputation of reducing readability. However, in the right hands, it may result in less duplication.

Do you think it's use has enough of a negative impact on readability? Are there enough legitimate use cases do justify the potential misuse?

How often do you use it? Have you seen it used in contexts where it aids readability?

Do you think modern programming languages should come with it? Users of languages without the ternary operator (golang etc), do you miss it?

Top comments (50)

Collapse
 
idanarye profile image
Idan Arye

Proper formatting goes a long way at improving readability:

variable = 
    condition1 ? expression1 :
    condition2 ? expression2 :
    condition3 ? expression3 :
    condition4 ? expression4 :
    default_expression;
Collapse
 
alainvanhout profile image
Alain Van Hout • Edited

I'd tend to just method extract this, and use explicit return statements inside plain if-statements.

At least in part, that's because the conditions will rarely be as brief (when they are thus numerous).

Collapse
 
martingbrown profile image
Martin G. Brown

I tend to go a bit further and indent the two expressions:

return
    condition ?
        trueExpression :
        falseExpression;
Collapse
 
shreyasminocha profile image
Shreyas Minocha

Interesting take.

Collapse
 
gcugreyarea profile image
Barry Robinson • Edited

Most modern compilers are smart enough to optimise control statements. It is more readable than it otherwise would be, but why do it in the first place?

Collapse
 
lorenmcclaflin profile image
Loren McClaflin

Wow, Idan, I love your formatting. I’ve not seen a ternary formatted this way, and it really does improve readability!
Thanks for the great tip!

Collapse
 
bgadrian profile image
Adrian B.G.

I feel the same as other "syntax sugar cool" things, when used correctly it improves your code, but most of the time it's going to be over used. I've seen some horrors using the ternary operator you would not believe.


what = (f() ? (g() && x ? a + d : b ) : c)

I used it when dealing with simple, 1 word condition and values.

As a Go newbie I don't miss it, having so few language constructs and operators it is very relieving, you need a condition you use if, simple and efficient. All your peers will do the same, everyone understands it, and it is harder to screw it up.

Collapse
 
shreyasminocha profile image
Shreyas Minocha • Edited

I agree. I've seen it used in some perfectly legitimate ways such as in JSVerbalExpressions.

    startOfLine(enable = true) {
        this._prefixes = enable ? '^' : '';
        return this.add();
    }

    endOfLine(enable = true) {
        this._suffixes = enable ? '$' : '';
        return this.add();
    }

This pattern is repeated throughout the library. Using if-else here would be painful, but it'd be manageable. At least one wouldn't have to deal with the code like you described. Why people would write code of that sort (except for codegolf) is beyond me.

Collapse
 
bgadrian profile image
Adrian B.G.

Why people would write code of that sort (except for codegolf) is beyond me.

The most common reason I saw (is not specific to this problem) was when a dev had to add some new logic, instead of refactoring the ternary expression into an if, switch or separate to functions, or objects or whatever added the new complexity in place.

The reasons why that happened were various, excuses like "I was in a hurry", "I didn't had the time to understand the code" and so on were common.

Fear of refactoring is a common problem in projects without tests and/or devs without the desire to write good code, or just insane release schedule, you know, common problems.

Collapse
 
qm3ster profile image
Mihail Malo • Edited
// WHY NOT THIS?
startOfLine(enable = true) {
    this._prefixes = (enable && '^') || ''
    return this.add()
}

// OR EVEN THIS?
endOfLine(enable = true) {
    return(this._suffixes = (enable && '$') || '', this.add.bind(this))()
    //    ^ look mom, no space after `return`                          ^
    //                                                                 |
    //             note the artisanal external position of call parens |
}
Collapse
 
fxedel profile image
Felix Edelmann

I actually like the Kotlin syntax that uses the if/else keywords instead of ?/:

val max = if (a > b) a else b 

It's much more readable than the JS syntax.

However, I often use ternary operators in both languages as they are just quick to write und don't mess up the code with an if/else clause.

Collapse
 
nektro profile image
Meghan (she/her)

Iirc if you surround the if/else statement in parentheses then it is valid in JavaScript as well and will assign the appropriate value to the variable

Collapse
 
z3ta profile image
Z3TA

Can you post an example ? I only get syntax error :/

Collapse
 
_andys8 profile image
Andy

Totally wrong. Statement vs expression. Assignment without mutation.

Collapse
 
shreyasminocha profile image
Shreyas Minocha

That's interesting. I didn't know some languages did it that way.

Collapse
 
kip13 profile image
kip • Edited

This is valid in all languages where if else are an expression instead of statement: Python, Rust, Scala, Kotlin, Haskell,F#....

Collapse
 
t4rzsan profile image
Jakob Christensen

F# does it too.

Collapse
 
nimmo profile image
Nimmo

I'm a big fan of ternaries in JS, because IMO expressions are better than statements for reducing cognitive load, which is generally my primary goal when coding.

However, I find that my personal favourite formatting for ternaries is:

condition
  ? valueIfTrue
  : valueIfFalse;

To be clear though, I do believe that if/else is better for readability (especially for less experienced developers), and I prefer languages which only have expressions (and consequently their if/elses are expressions too). But for languages that aren't as nice as that, I always prefer ternaries for assignments.

Collapse
 
hudsonburgess7 profile image
Hudson Burgess

I think the ternary operator actually encourages readability.

In my experience, the only time ternary syntax reduces readability is if you have too much logic jammed inside a conditional. And if that's the case, the normal if / else syntax wouldn't make things much clearer.

In other words, the ternary operator just "amplifies" how (un)readable the conditional logic is to begin with. Does that make sense?

Collapse
 
nathanverrilli profile image
nathanverrilli

I fail to see the huge fuss. I like the ternary operator, as it renders quick this-or-that-depending expressions easy and fast. Yes, it can be misused. Of course, I still use GOTO for forward error handling in device drivers. Nowhere else, but the legibility increase over nesting a gagzillion IF statements is significant.

I'm for it, because ...
(A) There are a number of good use cases
(B) Stupid coders code stupid regardless of tools. Restricting
everyone else isn't going to make their code better, but it
does make our code worse.

Collapse
 
shreyasminocha profile image
Shreyas Minocha

Stupid coders code stupid regardless of tools

Good point :)

Collapse
 
de_maric profile image
Dejan Maric

Beautifully said :)

Collapse
 
timsev profile image
Tim Severien

I use the ternary operator a lot. I strongly believe it should be used with caution. Most of the time, I start with regular if-statements and reduce it to a ternary operator if I deem the condition and expressions simple enough, even though I realise that is extremely subjective. I never nest ternary operators.

value < threshold ? value : otherValue;

object.someState || object.someOtherState
  ? object.child.doSomething()
  : object.otherChild.doSomethingElse();
Collapse
 
lexlohr profile image
Alex Lohr

In it's simple use, the ternary operator is rather helping than hindering the reading flow, as illustrated by the example:

// w/o ternary operator:
let result;
if (condition) {
  result = CONDITION_MET;
} else {
  result = CONDITION_NOT_MET;
}

// w/ ternary operator:
const result = condition ? CONDITION_MET : CONDITION_NOT_MET;

However, in golfed or minified code, one usually finds abominable abuses of the ternary operator within already complicated statements that reduce readability. Only use them there, never the code you work on.

Collapse
 
courier10pt profile image
Bob van Hoove • Edited

Nitpick: It's a ternary operator known as the conditional operator. For instance in javascript:

The conditional (ternary) operator is the only JavaScript operator that takes three operands. This operator is frequently used as a shortcut for the if statement.

(ref: MDN Web docs : Conditional (ternary) Operator

I use it quite often. I'm a fan of the formatting style that Nimmo proposes, using a newline for the ? part and another newline for the : such that I don't have to scroll sideways.

Collapse
 
shreyasminocha profile image
Shreyas Minocha

Yeah. Thanks for pointing that out.

Collapse
 
jdsteinhauser profile image
Jason Steinhauser

I tend to use the conditional operator mostly with one-line functions or properties. The idiomatic syntax is a lot easier in C# (my most used language) for one-line functions using the conditional operator.

New Hotness:

int Max(int a, int b) => a > b ? a : b;

Old and Busted:

int Max(int a, int b) {
    if (a > b) {
        return a;
    }
    return b;
}