We often see and write things like this:
function sayHey(name) {
name = name || "Precious";
console.log(`Hey ${name}`);
}
sayHey("Morty"); //Hey Morty
sayHey(); //Hey Precious
But did you know that the ??
operator, known as the nullish coalescing operator, is often considered safer than the ||
operator (logical OR) in JavaScript for certain use cases because of how they handle falsy values?
Let me explain...
Understanding Falsy Values
Let's first have a look at what is considered a falsy value in JavaScript. In JavaScript, the following values are considered falsy:
false
0
(zero)""
(empty string)null
undefined
NaN
(Not a Number)
How the logical OR (||
) works
Now let's have a closer look at what the logical OR (||
) operator actually does behind the scenes. ||
returns the right-hand operand if the left-hand operand is falsy. This is straightforward when you want to default to the right-hand operand only if the left-hand one is null
or undefined
. However, it can lead to unintended consequences with other falsy values like 0
, ""
, or NaN
, which might be valid in your program logic.
Let's look at a simple example to better understand this:
const count = 0;
const defaultCount = count || 10; // defaultCount is 10, not 0
Here, 0
might be a valid value for count, but since 0
is considered falsy, defaultCount
becomes 10
instead of 0
.
How the nullish coalescing operator (??
) works
The nullish coalescing operator (??
) in contrast to the logical OR (||
) returns the right-hand operand only if the left-hand operand is null
or undefined
. It does not react to other falsy values like 0
, ""
, or NaN
. This makes ??
safer for certain use cases where you want to include these falsy values as valid inputs.
Let's look at our example from above again, but this time using ??
:
const count = 0;
const defaultCount = count ?? 10; // defaultCount is 0
Here, defaultCount
correctly remains 0
because the nullish coalescing operator only checks for null
or undefined
, not for any falsy value.
Conclusion
I hope this short article shed some light on the topic when to use ??
over ||
. The choice between ||
and ??
certainly depends on the specific requirements of your code, but next time you want to fallback to default values, I'd encourage you to spend one additional second to evaluate the right operator for your use case. In short:
Use
||
when you want to use a default value for any falsy value.Use
??
when0
,""
, orNaN
are meaningful values in your context and you only want to fall back to a default fornull
orundefined