ECMASCRIPT 2024 | What's new?

ECMASCRIPT 2024 | What's new?

JavaScript, the dynamic language that powers much of the web, is constantly evolving. The ECMAScript specification, which serves as the foundation for JavaScript, sees annual updates that bring new features and improvements.

1. Top-Level Await

One of the most exciting features of ES2024 is Top-Level Await. Previously, the await keyword could only be used inside asynchronous functions, which often led to cumbersome code when trying to use it at the top level of a module. With ES2024, you can now use await directly at the top level of your modules, making asynchronous code cleaner and more intuitive.

Example:

// ES2024 code
const data = await fetchData();
console.log(data);

This change simplifies code that interacts with asynchronous operations, making it easier to read and maintain.

2. Logical Assignment Operators

ES2024 introduces Logical Assignment Operators, which combine logical operators with assignment. This new feature allows for more concise and expressive code when performing common logical operations.

Example:

// Before ES2024
x = x || defaultValue;

// With Logical Assignment Operators
x ||= defaultValue;

These operators help streamline code and can reduce verbosity in scenarios involving default values or conditional updates.

3. Record & Tuple

Another notable addition in ES2024 is Record & Tuple. Records are immutable data structures that can be used for creating value-based data types, while Tuples are immutable lists. Both provide a way to handle data that doesn’t change over time, which can be useful for functional programming patterns and data integrity.

Example:

const record = #{ name: "John", age: 30 };
const tuple = #[1, 2, 3, 4];

console.log(record.name); // John
console.log(tuple[2]);   // 3

Records and Tuples are useful for representing fixed, unchanging sets of data, and they can enhance the performance and reliability of applications by reducing the likelihood of unintended side effects.

4. Pipeline Operator

The pipeline operator (|>) improves code readability in case of nested function calls because of it's functional styled syntax where the result of an expression is passed as an argument to the next function.

Example:

// Without pipeline operator
const calculatedValue = Math.ceil(Math.pow(Math.max(0, -10), 1/3));

// With pipeline operator
const calculatedValue = -10
  |> (n => Math.max(0, n)) // Replacing Math.max
  |> (n => Math.pow(n, 1/3)) // Replacing Math.pow
  |> Math.ceil; // Using Math.ceil

In this example:

  • The Math.max function ensures the number is not negative.

  • The Math.pow function calculates the cube root (raised to the power of 1/3).

  • The Math.ceil function rounds the number up to the nearest integer.

The pipeline operator (|>) simplifies chaining these operations, making the code more readable.

5. Realms

The Realms API introduces a new mechanism for creating isolated execution environments within a single JavaScript context. This allows developers to execute code in a way that is separate from the main execution context, which can be useful for various scenarios, including:

  • Sandboxing: Running untrusted code in a secure and isolated environment.

  • Modularization: Managing dependencies and code execution in separate realms to avoid conflicts.

  • Testing: Creating clean and isolated environments for testing code.

Key Features of the Realms API

  1. Creating Realms: The Realm constructor allows you to create a new realm. Each realm has its own global object and can be used to run code independently of other realms.

     javascriptCopy code// Create a new realm
     const realm = new Realm();
    
     // Evaluate code in the new realm
     const result = realm.evaluate('2 + 2');
     console.log(result); // Outputs: 4
    
  2. Isolated Global Objects: Each realm has its own global object, which means variables and functions defined in one realm are not accessible from another realm. This isolation helps prevent unintended interactions between different parts of the code.

     javascriptCopy codeconst realm1 = new Realm();
     const realm2 = new Realm();
    
     realm1.evaluate('const foo = "bar";');
     console.log(realm2.evaluate('typeof foo')); // Outputs: 'undefined'
    

As you explore these new features, keep in mind that browser and runtime support may vary, so always check compatibility and consider using feature detection or polyfills as needed.
Ciao!