Module: JavaScript for React

ES6 Overview

JavaScript for React: ES6 Overview

This section provides an overview of key ES6 (ECMAScript 2015) features commonly used in React development. Understanding these concepts is crucial for writing modern, efficient, and readable React code.

1. let and const

  • let: Declares a block-scoped variable. Its value can be reassigned.

    function example() {
      if (true) {
        let x = 10;
        x = 20; // Valid
        console.log(x); // Output: 20
      }
      // console.log(x); // Error: x is not defined
    }
    example();
    
  • const: Declares a block-scoped constant. Its value cannot be reassigned after initialization. Note: const doesn't mean the value is immutable, especially for objects and arrays. It means the variable identifier cannot be reassigned.

    const PI = 3.14159;
    // PI = 3.14; // Error: Assignment to constant variable.
    
    const myObject = { name: "Alice" };
    myObject.name = "Bob"; // Valid - modifying the object's property
    // myObject = { name: "Charlie" }; // Error - reassigning the variable
    

Why use let and const over var?

  • Scope: let and const are block-scoped, preventing accidental variable hoisting and making code easier to reason about. var is function-scoped, which can lead to unexpected behavior.
  • Readability & Maintainability: const clearly signals that a variable's value should not change, improving code clarity.

2. Arrow Functions

A concise syntax for writing function expressions.

  • Basic Syntax: (parameters) => expression

    const add = (a, b) => a + b;
    console.log(add(5, 3)); // Output: 8
    
  • Single Parameter: parameter => expression

    const square = x => x * x;
    console.log(square(4)); // Output: 16
    
  • No Parameters: () => expression

    const sayHello = () => console.log("Hello!");
    sayHello(); // Output: Hello!
    
  • Multiple Statements: (parameters) => { statements }

    const greet = (name) => {
      console.log("Hello, " + name + "!");
      console.log("Welcome!");
    };
    greet("World");
    
  • this Binding: Arrow functions lexically bind this. This means this refers to the surrounding context, unlike traditional function expressions where this can change based on how the function is called. This is particularly important in React class components.

3. Template Literals

Allow embedding expressions inside string literals.

  • Syntax: Use backticks (`) instead of single or double quotes.

    const name = "Bob";
    const age = 30;
    const message = `Hello, my name is ${name} and I am ${age} years old.`;
    console.log(message); // Output: Hello, my name is Bob and I am 30 years old.
    
  • Multiline Strings: Easily create multiline strings without concatenation.

    const html = `
      <div>
        <h1>Hello</h1>
        <p>This is a paragraph.</p>
      </div>
    `;
    console.log(html);
    

4. Destructuring

A convenient way to extract values from objects or arrays into distinct variables.

  • Object Destructuring:

    const person = {
      firstName: "Alice",
      lastName: "Smith",
      age: 25
    };
    
    const { firstName, lastName } = person;
    console.log(firstName); // Output: Alice
    console.log(lastName);  // Output: Smith
    
    // Renaming variables
    const { firstName: name, lastName: surname } = person;
    console.log(name); // Output: Alice
    console.log(surname); // Output: Smith
    
    // Default values
    const { city = "Unknown" } = person;
    console.log(city); // Output: Unknown
    
  • Array Destructuring:

    const numbers = [1, 2, 3, 4, 5];
    const [first, second, , fourth] = numbers; // Skip the third element
    console.log(first);  // Output: 1
    console.log(second); // Output: 2
    console.log(fourth); // Output: 4
    
    // Rest operator
    const [head, ...tail] = numbers;
    console.log(head); // Output: 1
    console.log(tail); // Output: [2, 3, 4, 5]
    

5. Spread and Rest Operators

  • Spread Operator (...): Expands an iterable (array, string, etc.) into individual elements.

    const arr1 = [1, 2, 3];
    const arr2 = [4, 5, 6];
    const combined = [...arr1, ...arr2]; // Output: [1, 2, 3, 4, 5, 6]
    
    const obj1 = { a: 1, b: 2 };
    const obj2 = { c: 3, d: 4 };
    const combinedObj = { ...obj1, ...obj2 }; // Output: { a: 1, b: 2, c: 3, d: 4 }
    
  • Rest Operator (...): Collects multiple elements into an array. Must be the last parameter in a function definition.

    function sum(...numbers) {
      let total = 0;
      for (const number of numbers) {
        total += number;
      }
      return total;
    }
    
    console.log(sum(1, 2, 3, 4)); // Output: 10
    

6. Classes

Syntactic sugar over JavaScript's prototype-based inheritance. Provides a more familiar class-based syntax.

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  getFullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

const person = new Person("John", "Doe");
console.log(person.getFullName()); // Output: John Doe

7. Modules (Import/Export)

Allows you to split your code into separate files and reuse it across your application.

  • Exporting:

    // math.js
    export function add(a, b) {
      return a + b;
    }
    
    export const PI = 3.14159;
    
  • Importing:

    // app.js
    import { add, PI } from './math.js';
    
    console.log(add(5, 3)); // Output: 8
    console.log(PI); // Output: 3.14159
    

8. for...of Loop

A simpler way to iterate over iterable objects (arrays, strings, Maps, Sets, etc.).

const colors = ['red', 'green', 'blue'];

for (const color of colors) {
  console.log(color);
}
// Output:
// red
// green
// blue

These ES6 features are fundamental to modern JavaScript and are heavily used in React development. Mastering them will significantly improve your ability to write clean, efficient, and maintainable React applications.