JavaScript Statements: Control Flow and Execution

In JavaScript, statements are instructions that the JavaScript interpreter can execute. These statements control the flow and execution of your code, dictating what happens, when, and how. Understanding JavaScript statements is crucial for writing effective and efficient code. This guide covers the essential types of statements, including control flow structures, conditional statements, and loops.

What are JavaScript Statements?

JavaScript statements are commands given to the JavaScript engine to perform specific actions. Each statement usually ends with a semicolon (;), although it is often optional due to automatic semicolon insertion (ASI). However, it’s a good practice to include semicolons for clarity and to avoid potential issues.

A JavaScript program is essentially a sequence of statements. The interpreter executes these statements in the order they appear, unless control flow statements alter this order.

Types of JavaScript Statements

JavaScript provides a variety of statements to control the flow of execution. These include:

  • Conditional Statements: if, else if, else, switch
  • Loop Statements: for, while, do...while, for...in, for...of
  • Jump Statements: break, continue, return, throw
  • Declaration Statements: var, let, const, function, class
  • Expression Statements: Assignments, increments, function calls, delete
  • Other Statements: debugger, import, export, try...catch...finally

Conditional Statements

Conditional statements allow you to execute different code blocks based on whether a specified condition is true or false.

The if Statement

The if statement executes a block of code if a condition is true.

Syntax:

if (condition) {
  // Code to execute if the condition is true
}

Example:

let x_if = 10;
if (x_if > 5) {
  console.log("x_if is greater than 5");
}

Output:

x_if is greater than 5

The if...else Statement

The if...else statement executes one block of code if the condition is true and another block of code if the condition is false.

Syntax:

if (condition) {
  // Code to execute if the condition is true
} else {
  // Code to execute if the condition is false
}

Example:

let y_else = 3;
if (y_else > 5) {
  console.log("y_else is greater than 5");
} else {
  console.log("y_else is not greater than 5");
}

Output:

y_else is not greater than 5

The if...else if...else Statement

The if...else if...else statement allows you to check multiple conditions sequentially.

Syntax:

if (condition1) {
  // Code to execute if condition1 is true
} else if (condition2) {
  // Code to execute if condition2 is true
} else {
  // Code to execute if all conditions are false
}

Example:

let z_elseif = 7;
if (z_elseif > 10) {
  console.log("z_elseif is greater than 10");
} else if (z_elseif > 5) {
  console.log("z_elseif is greater than 5 but not greater than 10");
} else {
  console.log("z_elseif is not greater than 5");
}

Output:

z_elseif is greater than 5 but not greater than 10

The switch Statement

The switch statement allows you to select one of several code blocks to execute based on the value of an expression.

Syntax:

switch (expression) {
  case value1:
    // Code to execute if expression === value1
    break;
  case value2:
    // Code to execute if expression === value2
    break;
  default:
    // Code to execute if expression does not match any value
}

Example:

let day_switch = "Monday";
switch (day_switch) {
  case "Monday":
    console.log("It's Monday!");
    break;
  case "Tuesday":
    console.log("It's Tuesday!");
    break;
  default:
    console.log("It's another day!");
}

Output:

It's Monday!

Note: Don’t forget the break statement. Without it, the code will continue to execute the next case even if it doesn’t match. ⚠️

Loop Statements

Loop statements allow you to execute a block of code repeatedly.

The for Loop

The for loop is used to execute a block of code a specific number of times.

Syntax:

for (initialization; condition; increment) {
  // Code to execute repeatedly
}

Example:

for (let i_for = 0; i_for < 5; i_for++) {
  console.log("Iteration:", i_for);
}

Output:

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4

The while Loop

The while loop executes a block of code as long as a condition is true.

Syntax:

while (condition) {
  // Code to execute repeatedly
}

Example:

let j_while = 0;
while (j_while < 5) {
  console.log("Iteration:", j_while);
  j_while++;
}

Output:

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4

The do...while Loop

The do...while loop is similar to the while loop, but it executes the block of code at least once, even if the condition is initially false.

Syntax:

do {
  // Code to execute repeatedly
} while (condition);

Example:

let k_dowhile = 0;
do {
  console.log("Iteration:", k_dowhile);
  k_dowhile++;
} while (k_dowhile < 5);

Output:

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4

The for...in Loop

The for...in loop is used to iterate over the properties of an object.

Syntax:

for (let key in object) {
  // Code to execute for each property
}

Example:

const person_forin = {
  name: "John",
  age: 30,
  city: "New York",
};

for (let key in person_forin) {
  console.log(key + ": " + person_forin[key]);
}

Output:

name: John
age: 30
city: New York

The for...of Loop

The for...of loop is used to iterate over iterable objects (e.g., arrays, strings, maps, sets).

Syntax:

for (let value of iterable) {
  // Code to execute for each value
}

Example:

const colors_forof = ["red", "green", "blue"];

for (let color of colors_forof) {
  console.log(color);
}

Output:

red
green
blue

Jump Statements

Jump statements alter the normal flow of execution in a program.

The break Statement

The break statement is used to exit a loop or a switch statement.

Example:

for (let i_break = 0; i_break < 10; i_break++) {
  if (i_break === 5) {
    break; // Exit the loop when i_break is 5
  }
  console.log("Iteration:", i_break);
}

Output:

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4

The continue Statement

The continue statement is used to skip the rest of the current iteration of a loop and continue with the next iteration.

Example:

for (let j_continue = 0; j_continue < 10; j_continue++) {
  if (j_continue === 5) {
    continue; // Skip the rest of the iteration when j_continue is 5
  }
  console.log("Iteration:", j_continue);
}

Output:

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
Iteration: 6
Iteration: 7
Iteration: 8
Iteration: 9

The return Statement

The return statement is used to exit a function and return a value.

Example:

function add(a, b) {
  return a + b; // Return the sum of a and b
}

let sum_return = add(3, 5);
console.log("Sum:", sum_return);

Output:

Sum: 8

The throw Statement

The throw statement is used to throw an exception, which can be caught using a try...catch block.

Example:

function divide(a, b) {
  if (b === 0) {
    throw new Error("Cannot divide by zero.");
  }
  return a / b;
}

try {
  let result_throw = divide(10, 0);
  console.log("Result:", result_throw);
} catch (error) {
  console.error("Error:", error.message);
}

Output:

Error: Cannot divide by zero.

Declaration Statements

Declaration statements introduce new variables, functions, or classes into the code.

var, let, and const

These keywords are used to declare variables. var has function scope, while let and const have block scope. const is used for declaring constants, which cannot be reassigned after initialization.

var x_var = 10; // Function-scoped variable
let y_let = 20; // Block-scoped variable
const PI_const = 3.14; // Constant variable

function

The function keyword is used to declare a function.

function greet(name) {
  console.log("Hello, " + name + "!");
}

class

The class keyword is used to declare a class.

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old.");
  }
}

Expression Statements

Expression statements are expressions that are also valid statements.

Assignments

Assigning a value to a variable.

x_assign = 5;
y_assign = x_assign + 2;

Increments and Decrements

Incrementing or decrementing a variable’s value.

i_inc++;
j_dec--;

Function Calls

Calling a function.

console.log("Hello, world!");
alert("This is an alert!");

delete

The delete operator is used to remove a property from an object.

const obj_del = { a: 1, b: 2 };
delete obj_del.a;
console.log(obj_del); // Output: { b: 2 }

Other Statements

debugger

The debugger statement invokes the debugging functionality available in the browser or JavaScript environment.

let a_debug = 5;
debugger; // Pause execution for debugging
let b_debug = a_debug * 2;
console.log(b_debug);

import and export

These statements are used for modular JavaScript, allowing you to import and export functions, objects, or primitive values between JavaScript modules.

// Exporting a function from a module
export function add(a, b) {
  return a + b;
}

// Importing the function in another module
import { add } from './module.js';

try...catch...finally

The try...catch...finally statement handles exceptions. The try block contains code that might throw an exception, the catch block contains code that handles the exception, and the finally block contains code that executes regardless of whether an exception was thrown.

try {
  // Code that might throw an exception
  let result_try = divide(10, 0);
  console.log("Result:", result_try);
} catch (error) {
  // Code to handle the exception
  console.error("Error:", error.message);
} finally {
  // Code that always executes
  console.log("Finally block executed.");
}

Best Practices for Writing Statements

  • Use Semicolons: Always include semicolons at the end of statements for clarity.
  • Proper Indentation: Indent your code properly to improve readability.
  • Meaningful Variable Names: Use descriptive variable names to make your code easier to understand.
  • Avoid Global Variables: Minimize the use of global variables to prevent naming conflicts and improve code maintainability.
  • Use Strict Mode: Enable strict mode ("use strict";) to catch common coding mistakes and improve code quality.

Real-World Example: Form Validation

Let’s create a simple form validation example using JavaScript statements:

<form id="myForm">
  <label for="username">Username:</label>
  <input type="text" id="username" name="username"><br><br>

  <label for="password">Password:</label>
  <input type="password" id="password" name="password"><br><br>

  <button type="button" onclick="validateForm()">Submit</button>
</form>

<script>
function validateForm() {
  let username_validate = document.getElementById("username").value;
  let password_validate = document.getElementById("password").value;

  if (username_validate === "") {
    alert("Username must be filled out");
    return false;
  }

  if (password_validate.length < 8) {
    alert("Password must be at least 8 characters long");
    return false;
  }

  alert("Form submitted successfully!");
  return true;
}
</script>

In this example, the validateForm function uses if statements to check whether the username and password fields are valid. If either field is invalid, an alert message is displayed, and the function returns false, preventing the form from being submitted.

Conclusion

JavaScript statements are the building blocks of your code, controlling the flow of execution and dictating how your program behaves. Understanding the different types of statements and how to use them effectively is essential for writing robust, maintainable, and efficient JavaScript code. From conditional statements to loops and jump statements, each type serves a specific purpose, allowing you to create complex logic and dynamic behavior in your web applications. By following best practices and continuously practicing, you can master the art of using JavaScript statements to bring your ideas to life.