Nullish Coalescing Operator Explained

Posted by Jino Antony on 2020-04-19

Nullish coalescing operator is a new operator in javascript, which is actually an ES2020 specification. It is a short-circuiting operator much like the && and || operators.

What is it?

Nullish coalescing operator (??) is a logical operator that returns its RHS operand when the LHS operand is nullish (null or undefined), otherwise returns its LHS operand.

const name = null ?? 'John Doe'
// output: John Doe

Why do we need it?

Prior to nullish coalescing operator, the logical OR (||) operator is used to check for nullish values.

const name = null || 'John Doe'
// output: John Doe

But the problem is || check for truthy or falsy value. That is it returns RHS operand when LHS operand is falsy (null, undefined, false, 0, '', NaN), otherwise it returns LHS operand.

const name = '' || 'John Doe'
// output: John Doe

const name = '' ?? 'John Doe'
// output: ''

To better understand the problem, consider the following code sample.

function joinArray(array, delimiter) {
  delimiter = delimiter || ',';
  return arr.join(delimiter);
}

In this example, the delimiter parameter is optional. , will be the default value if no value is passed for the delimiter parameter. But there is a bug in this code. What happens if we want to join the array without any delimiters, that is using '' as the parameter?

let joined = joinArray(['Find', 'the', 'bug'], '');
// expected output: Findthebug
// actual output: Find,the,bug

As you can see, the expected output is 'Findthebug', but the actual output is 'Find,the,bug'. This is because the || operator only checks if the operands are truthy or falsy and the empty string ('') evaluates to false. So the RHS operand, comma (,) in this case is returned.

We can fix this bug easily by replacing || with ??.

function joinArray(array, delimiter) {
  delimiter = delimiter ?? ',';
  return arr.join(delimiter);
}

And we get the correct results.

let joined = joinArray(['Find', 'the', 'bug'], '');
// output: Findthebug

Note on Chaining with AND or OR operators

It is not possible to chain AND (&&) and OR (||) operators directly with ??. Combining this will throw a syntax error.

const name = null || undefined ?? 'John Doe'
//Uncaught SyntaxError: Unexpected token '??

If you need you to combine them, then you must wrap one of the operator groups in parenthesis.

const name = (null || undefined) ?? 'John Doe'

This will remove the ambiguity and anyone reading the code can immediately understand what it does. Happy Coding!