Search code examples
javascriptoptimizationsyntax-error

Ternary operators in JavaScript without an "else"


I've always had to put null in the else conditions that don't have anything. Is there a way around it?

For example,

condition ? x = true : null;

Basically, is there a way to do the following?

condition ? x = true;

Now it shows up as a syntax error.

FYI, here is some real example code:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

Solution

  • First of all, a ternary expression is not a replacement for an if/else construct - it's an equivalent to an if/else construct that returns a value. That is, an if/else clause is code, a ternary expression is an expression, meaning that it returns a value.

    This means several things:

    • use ternary expressions only when you have a variable on the left side of the = that is to be assigned the return value
    • only use ternary expressions when the returned value is to be one of two values (or use nested expressions if that is fitting)
    • each part of the expression (after ? and after : ) should return a value without side effects (the expression x = true returns true as all expressions return the last value, but it also changes x without x having any effect on the returned value)

    In short - the 'correct' use of a ternary expression is

    var resultofexpression = conditionasboolean ? truepart: falsepart;
    

    Instead of your example condition ? x=true : null ;, where you use a ternary expression to set the value of x, you can use this:

     condition && (x = true);
    

    This is still an expression and might therefore not pass validation, so an even better approach would be

     void(condition && x = true);
    

    The last one will pass validation.

    But then again, if the expected value is a boolean, just use the result of the condition expression itself

    var x = (condition); // var x = (foo == "bar");
    

    UPDATE

    In relation to your sample, this is probably more appropriate:

    defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';