Don’t Confuse ?? with || in JavaScript: Here’s How They Differ!

chintanonweb - Oct 24 - - Dev Community

?? 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;
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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;
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 for null or undefined.
  • 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
Enter fullscreen mode Exit fullscreen mode

Here, count is 0, which is a valid value but falsy in JavaScript.

  • Using ??, defaultCount1 retains 0, because 0 is neither null nor undefined.
  • Using ||, defaultCount2 becomes 10, because 0 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: ''
Enter fullscreen mode Exit fullscreen mode

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, '', and undefined) as needing fallback values.
  • You are fine with replacing values like 0 or false.

Example:

let isLoggedIn = false;
let loginStatus = isLoggedIn || 'Not logged in';

console.log(loginStatus); // Output: 'Not logged in'
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Mistake 2: Misunderstanding Nullish Coalescing

let userPreference = null;
let defaultPreference = userPreference ?? false;

console.log(defaultPreference); // Output: false
Enter fullscreen mode Exit fullscreen mode

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;
Enter fullscreen mode Exit fullscreen mode

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 about null or undefined.
  • 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.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .