Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why would Javascript `if...else if` not end with an `else`?

Here is a snippet of JavaScript code from a tutorial I was working with. I don’t understand why it doesn’t end with a final else clause; I thought that was a rule.

var curScene = 0;

function changeScene(decision) {
  var message = "";

  if(curScene == 1) {
    message = " welcome";
  } else if (curScene == 2) {
    message = " this is scene two";
  } else if (curScene == 3) {
    message = " this is scene three";
  }

  document.getElementById("sceneimg").src = "scene" + curScene + ".png";

  if(message != ""){
    alert(message);
  }
}
like image 996
Starkemp315 Avatar asked Nov 09 '11 05:11

Starkemp315


People also ask

Is it necessary to end else if with else?

You never need an else clause.

Can we have if else if without else in JavaScript?

No it's not compulsory to have else with an if. To my knowledge, there's no need to have an else in any language. If there's nothing special that you want to do when the if condition is false, there's no logical need for it either. It would be an empty block.

Why is my else if statement not working?

If you are getting an error about the else it is because you've told the interpreter that the ; was the end of your if statement so when it finds the else a few lines later it starts complaining. A few examples of where not to put a semicolon: if (age < 18); if ( 9 > 10 ); if ("Yogi Bear". length < 3); if ("Jon".

Why do we use if else statements in JavaScript?

Definition and Usage. The if/else statement executes a block of code if a specified condition is true. If the condition is false, another block of code can be executed. The if/else statement is a part of JavaScript's "Conditional" Statements, which are used to perform different actions based on different conditions.


4 Answers

I thought it was always supposed to end with an "else"?

The else block is optional. You can have if without else.

like image 181
Thilo Avatar answered Oct 30 '22 04:10

Thilo


For the same reason as why you can have just a single if:

if( /*condition*/ ) {
    //some code
}

//other stuff
like image 27
Petar Ivanov Avatar answered Oct 30 '22 05:10

Petar Ivanov


Consider 3 Scenario
Scenario 1: Boolean condition

if (condition) {}
else {}

Specifying a condition as else if would be redundant, and it's really obvious to the reader what the code does. There is no argument for using else if in this case.

Scenario 2: Infinite states

Here we are interested in testing for conditions A and B (and so on), and we may or may not be interested in what happens if none of them holds:

if (conditionA) {}
else if (conditionB) {}
else {} // this might be missing as it is in your case

The important point here is that there isn't a finite number of mutually-exclusive states, for example: conditionA might be num % 2 == 0 and conditionB might be num % 3 == 0.

I think it's natural and desirable to use a reasonable amount of branches here; if the branches become too many this might be an indication that some judicious use of OO design would result in great maintainability improvements.

Scenario 3: Finite states

This is the middle ground between the first two cases: the number of states is finite but more than two. Testing for the values of an enum-like type is the archetypal example:

if (var == CONSTANT_FOO) {}
else if (var == CONSTANT_BAR) {} // either this,
else {} // or this might be missing

In such cases using a switch is probably better because it immediately communicates to the reader that the number of states is finite and gives a strong hint as to where a list of all possible states might be found (in this example, constants starting with CONSTANT_). My personal criteria is the number of states I 'm testing against: if it's only one (no else if) I 'll use an if; otherwise, a switch. In any case, I won't write an else if in this scenario.

Adding else as an empty catch-errors block

This is directly related to scenario #2 above. Unless the possible states are finite and known at compile time, you can't say that "in any other case" means that an error occurred. Seeing as in scenario #2 a switch would feel more natural, I feel that using else this way has a bad code smell.

Use a switch with a default branch instead. It will communicate your intent much more clearly:

switch(direction) {
    case 'up': break;
    case 'down': break;
    default: // put error handling here if you want
}

This might be a bit more verbose, but it's clear to the reader how the code is expected to function. In my opinion, an empty else block would look unnatural and puzzling here.

like image 25
Wazy Avatar answered Oct 30 '22 06:10

Wazy


It doesn't have to, for the same reason an if on its own doesn't require an else.

Usually it's a good idea to have one, as a sort of "catch-all" situation, but the above code could be written as:

switch(curScene) {
    case 1: message = " welcome"; break;
    case 2: message = " this is scene two"; break;
    case 3: message = " this is scene three"; break;
}

In the above code, I could also add:

    default: message = " invalid curScene value"; break;

But it's completely optional to do so. It depends on how reliable the curScene variable is whether or not I personally would add it in.

like image 21
Niet the Dark Absol Avatar answered Oct 30 '22 04:10

Niet the Dark Absol