Zach Snoek
Zach Snoek's Blog

Zach Snoek's Blog

When to use logical OR vs. nullish coalescing in JavaScript

Zach Snoek's photo
Zach Snoek
·Apr 9, 2022·

3 min read

Introduction

It’s common to use the logical OR operator (||) to specify a default value:

function createSong(title, artist) {
    return {
        title: title || '(Untitled)',
        artist: artist || '(Unknown)',
    }
}

ES2020 adds the nullish coalescing operator (??) which can also be used to create default values:

function createSong(title, artist) {
    return {
        title: title ?? '(Untitled)',
        artist: artist ?? '(Unknown)',
    }
}

If you called both versions of createSong and specified the empty string for title and artist, would the result be the same?

On the surface, it might seem like we’d get the same result––but that’s not quite the case. In this post, I want to briefly discuss the difference between the two operators and when you would use each.

The difference between || and ??

The logical OR operator returns the left operand if it’s truthy and the right operand otherwise:

console.log(true || false); // true
console.log(false || true); // true

console.log('foo' || null); // "foo"
console.log(undefined || 0); // 0

This can be useful for creating default values, but it can have unexpected results if you use a falsy left operand that should be considered valid:

const foo = 0; // 0 is our intended value and is falsy

const bar = foo || 100;

console.log(bar); // 100

This is where the nullish coalescing operating can help us out. The nullish coalescing operator is similar to the logical OR, but is more strict: it returns the right operand only if the left is null or undefined:

console.log(null ?? true); // true
console.log(undefined ?? true); // true

The other falsy values will be returned if they’re used as the left operand:

console.log(0 ?? true); // 0
console.log('' ?? true); // ''

We can make our previous example work as intended by using the nullish coalescing operator instead:

const foo = 0;

const bar = foo ?? 100;

console.log(bar); // 0

When to use each

When creating default values, you should only use the logical OR operator when you want all falsy left operands to be considered invalid. For example, if you want to set a default when the left operand is the empty string, use the logical OR.

Use the nullish coalescing operator to make it clear that the left operand should only be null or undefined if it’s not truthy. In addition, use it when using optional chaining:

function createSong(title, artist) {
    return {
        title: title ?? '(Untitled)',
        artist: artist ?? '(Unknown)',
    }
}

const song = createSong('Dancing Queen', 'ABBA');

const releaseDate = song?.releaseDate ?? '(unknown)';

console.log(`${song.title} was released on ${releaseDate}`); // "Dancing Queen was released on (unknown)"

Further reading


Let’s connect

If you’re interested in more articles like this, subscribe to my newsletter and connect with me on LinkedIn and Twitter!

 
Share this