Nullish Coalescing in JavaScript

Nullish Coalescing Operator (??)

The nullish coalescing operator (??), introduced in ECMAScript 2020, provides a concise way to handle default values for variables that might be null or undefined.

Background

Before the nullish coalescing operator, developers often used the logical OR operator (||) to provide default values. However, this approach would use the default value for any falsy value (e.g., '', 0, false), not just null or undefined.

Example using logical OR (||):

const config = {
  animationDuration: 0,
  numberOfItems: null
};

const duration = config.animationDuration || 300;
const items = config.numberOfItems || 10;

console.log(duration); // 300 (unintended)
console.log(items);    // 10

In the example above, the duration variable is assigned 300 instead of 0 because 0 is a falsy value. The nullish coalescing operator solves this problem by only using the default value for null or undefined.

Usage

The nullish coalescing operator (??) returns the right-hand side operand only when the left-hand side is null or undefined, allowing for more precise control over default values.

Example using nullish coalescing (??):

const config = {
  animationDuration: 0,
  numberOfItems: null  
};

const duration = config.animationDuration ?? 300;
const items = config.numberOfItems ?? 10;

console.log(duration); // 0   (intended)
console.log(items);    // 10

In the example above, the duration variable is assigned 0 because config.animationDuration is 0, which is not null or undefined.

Situations It's Useful In

Configuration Objects

Provide sensible defaults for missing or explicitly nullish properties in configuration objects.

const config = {
  apiKey: null,
  timeout: 0
};

const apiKey = config.apiKey ?? 'default_api_key';
const timeout = config.timeout ?? 5000;

Function Parameters

Define default values for null or undefined arguments in functions while allowing falsy values to be passed explicitly.

function greet(name) {
  const username = name ?? 'Anonymous';
  console.log(`Hello, ${username}!`);
}

greet();           // Hello, Anonymous!
greet(null);       // Hello, Anonymous!
greet('John Doe'); // Hello, John Doe!

API Responses

Provide default values for potentially missing or null properties in API responses to avoid errors and ensure expected behavior.

const response = {
  data: null,
  error: null
};

const data = response.data ?? [];
const error = response.error ?? 'Unknown error';