?? vs || in JavaScript: The Little-Known Difference
Introduction
JavaScript provides several ways to handle undefined or null values in code. Two common operators used for this purpose are the nullish coalescing operator (??) and the logical OR operator (||). While these operators may seem similar at first glance, their behavior can differ significantly in certain situations. Understanding the differences between these two operators is essential, especially for beginners who want to write more precise and bug-free code.
In this guide, we’ll explore the difference between ??
and ||
in JavaScript, breaking it down step by step with examples so you can go from zero to hero in no time.
What Is the Nullish Coalescing Operator (??)?
The nullish coalescing operator ??
is used to provide a fallback value when dealing with null or undefined. It only checks whether a value is null
or undefined
—and if it is, it returns the fallback value provided.
Syntax:
let result = value ?? fallbackValue;
In this expression, if value
is either null
or undefined
, the fallbackValue
will be returned.
Example 1: Using Nullish Coalescing Operator (??)
let name = null;
let defaultName = name ?? 'John Doe';
console.log(defaultName); // Output: 'John Doe'
In this example, name
is null
, so defaultName
is assigned 'John Doe'
as a fallback.
Key Points:
??
checks for null or undefined.- It returns the value on the left if it is NOT null or undefined, otherwise, it returns the fallback on the right.
What Is the Logical OR Operator (||)?
The logical OR operator ||
is another operator used for fallback values, but it works differently. It checks if the left-hand side of the expression is a falsy value. In JavaScript, falsy values include null
, undefined
, false
, 0
, NaN
, and ''
(empty string).
Syntax:
let result = value || fallbackValue;
If value
is falsy, fallbackValue
will be returned.
Example 2: Using Logical OR Operator (||)
let age = 0;
let defaultAge = age || 18;
console.log(defaultAge); // Output: 18
In this case, age
is 0
, which is a falsy value, so defaultAge
is assigned 18
.
Key Points:
||
checks for any falsy value.- If the value on the left is falsy, it returns the fallback value on the right.
The Key Difference Between ?? and ||
At first glance, ??
and ||
might seem to serve the same purpose—providing fallback values—but there’s an important distinction:
- The
??
operator only checks fornull
orundefined
. - The
||
operator checks for any falsy value.
This subtle difference becomes crucial when you are dealing with falsy but valid values like 0
, ''
, or false
.
Example 3: ?? vs || with Falsy Values
let count = 0;
let defaultCount1 = count ?? 10; // Using nullish coalescing
let defaultCount2 = count || 10; // Using logical OR
console.log(defaultCount1); // Output: 0
console.log(defaultCount2); // Output: 10
Here, count
is 0
, which is a valid value but falsy in JavaScript.
- Using
??
,defaultCount1
retains0
, because0
is neithernull
norundefined
. - Using
||
,defaultCount2
becomes10
, because0
is a falsy value.
When Should You Use ?? or ||?
The choice between ??
and ||
depends on the specific behavior you want.
Use ??
When:
- You want to handle null or undefined values specifically, without affecting falsy values like
0
,false
, or''
. - You need to preserve valid falsy values, such as
0
(a valid count), or''
(a valid empty string).
Example:
let userInput = '';
let fallbackInput = userInput ?? 'default input';
console.log(fallbackInput); // Output: ''
In this example, an empty string ''
is a valid user input, so ??
allows it to pass through without replacing it with the fallback.
Use ||
When:
- You want to treat all falsy values (like
0
,false
,NaN
,''
, andundefined
) as needing fallback values. - You are fine with replacing values like
0
orfalse
.
Example:
let isLoggedIn = false;
let loginStatus = isLoggedIn || 'Not logged in';
console.log(loginStatus); // Output: 'Not logged in'
Here, false
is treated as falsy, and the fallback 'Not logged in'
is used.
Common Pitfalls and How to Avoid Them
Now that you know the difference, let’s look at a couple of common mistakes beginners often make and how to avoid them.
Mistake 1: Using || for Valid Falsy Values
let score = 0;
let displayedScore = score || 'No score';
console.log(displayedScore); // Output: 'No score'
Problem: You wanted to display 0
as the score, but ||
replaced it with 'No score'
because 0
is falsy.
Solution: Use ??
to allow 0
to pass through.
let displayedScore = score ?? 'No score'; // Output: 0
Mistake 2: Misunderstanding Nullish Coalescing
let userPreference = null;
let defaultPreference = userPreference ?? false;
console.log(defaultPreference); // Output: false
Explanation: userPreference
is null
, so the fallback false
is used. This is correct behavior for ??
.
Frequently Asked Questions
Can I Use ?? and || Together?
Yes, you can use both operators in different parts of the same expression if needed.
Example:
let result = (value ?? defaultValue) || fallbackValue;
This first checks for null
or undefined
using ??
and then checks for other falsy values using ||
.
Is Nullish Coalescing Operator Supported in All Browsers?
The ??
operator is supported in modern browsers, but for older environments, you may need to use a transpiler like Babel.
What’s the Use Case for Each Operator?
- Use
??
when you specifically care aboutnull
orundefined
. - Use
||
when you want to handle any falsy value.
Does ?? Work with Other Falsy Values?
No, ??
only checks for null
and undefined
, not for other falsy values like false
, 0
, or ''
.
Conclusion
Understanding the difference between ??
and ||
in JavaScript is crucial for writing robust and error-free code. While both operators help in providing fallback values, their behavior differs when it comes to handling falsy values. Use ??
when you need to check for null
or undefined
, and use ||
when you want to check for any falsy value.
By mastering these operators, you'll be able to write more flexible and accurate code that behaves exactly as intended.