When should I use ?? (nullish coalescing) vs || (logical OR)?
The OR operator ||
uses the right value if left is falsy, while the nullish coalescing operator ??
uses the right value if left is null
or undefined
.
These operators are often used to provide a default value if the first one is missing.
But the OR operator ||
can be problematic if your left value might contain ""
or 0
or false
(because these are falsy values):
console.log(12 || "not found") // 12
console.log(0 || "not found") // "not found"
console.log("jane" || "not found") // "jane"
console.log("" || "not found") // "not found"
console.log(true || "not found") // true
console.log(false || "not found") // "not found"
console.log(undefined || "not found") // "not found"
console.log(null || "not found") // "not found"
In many cases, you might only want the right value if left is null
or undefined
. That's what the nullish coalescing operator ??
is for:
console.log(12 ?? "not found") // 12
console.log(0 ?? "not found") // 0
console.log("jane" ?? "not found") // "jane"
console.log("" ?? "not found") // ""
console.log(true ?? "not found") // true
console.log(false ?? "not found") // false
console.log(undefined ?? "not found") // "not found"
console.log(null ?? "not found") // "not found"
While the ??
operator isn't available in current LTS versions of Node (v10 and v12), you can use it with some versions of TypeScript or Node:
The ??
operator was added to TypeScript 3.7 back in November 2019.
And more recently, the ??
operator was included in ES2020, which is supported by Node 14 (released in April 2020).
When the nullish coalescing operator ??
is supported, I typically use it instead of the OR operator ||
(unless there's a good reason not to).
Nullish coalescing vs logical OR operator
The main difference is that null coalescing
checks left hand value explicitly against undefined
or null
(nullish)
The ||
logical operator checks left hand side falseness
Example:
const nullCoalescing = "" ?? "right" // nullCoalescing is ""
const logicalOr = "" || "right" // logicalOr is "right"
console.log(`null coalescing: ${nullCoalescing}`);
console.log(`logical or: ${logicalOr}`);
How is the nullish coalescing operator (??) different from the logical OR operator (||) in ECMAScript?
The ||
operator evaluates to the right-hand side if and only if the left-hand side is a falsy value.
The ??
operator (null coalescing) evaluates to the right-hand side if and only if the left-hand side is either null
or undefined
.
false
, 0
, NaN
, ""
(empty string) are for example considered falsy, but maybe you actually want those values. In that case, the ??
operator is the right operator to use.
Difference between || and ?? operators
The main difference is that nullish coalescing(??)
operator will only give the result as the right operand only if the left operand is either null
or undefined
.
Whereas the OR(||)
operator will give the result as right operand for all the falsy values of the left operand.
Below are some examples
- Snippet 1: With
0
as input
const a = 0;
// a || 10 --> Will result in 10, as || operator considers 0 as falsy value and resulting the right side operand
console.log(`a || 10 = ${a || 10}`);
// a ?? 10 --> Will result in 0, as ?? operator considers 0 as truthy value and resulting the left side operand
console.log(`a ?? 10 = ${a ?? 10}`);
Is there a null coalescing operator in JavaScript?
Update
JavaScript now supports the nullish coalescing operator (??). It returns its right-hand-side operand when its left-hand-side operand is null
or undefined
, and otherwise returns its left-hand-side operand.
Old Answer
Please check compatibility before using it.
The JavaScript equivalent of the C# null coalescing operator (??
) is using a logical OR (||
):
var whatIWant = someString || "Cookies!";
There are cases (clarified below) that the behaviour won't match that of C#, but this is the general, terse way of assigning default/alternative values in JavaScript.
Clarification
Regardless of the type of the first operand, if casting it to a Boolean results in false
, the assignment will use the second operand. Beware of all the cases below:
alert(Boolean(null)); // false
alert(Boolean(undefined)); // false
alert(Boolean(0)); // false
alert(Boolean("")); // false
alert(Boolean("false")); // true -- gotcha! :)
This means:
var whatIWant = null || new ShinyObject(); // is a new shiny object
var whatIWant = undefined || "well defined"; // is "well defined"
var whatIWant = 0 || 42; // is 42
var whatIWant = "" || "a million bucks"; // is "a million bucks"
var whatIWant = "false" || "no way"; // is "false"
Opposite of nullish coalescing operator
To my knowledge, there is no such operator and also no proposal to add one. Instead you can rely on the standard way to check for nullish values: b == null
a = b == null ? b : func(b)
Related Topics
How to Add/Subtract Dates with JavaScript
This' Does Not Work Properly in Another Event. I'm Clueless as to Why
How to Create a Web Worker from a String
In JavaScript, How to Check If an Array Has Duplicate Values
Access Denied to Jquery Script on Ie
Angular 2: Import External Js File into Component
How to Remove the Decimal Part from JavaScript Number
How to Add Predefined Length to Audio Recorded from Mediarecorder in Chrome
How to Load a JavaScript File Dynamically
Jquery - Get Text for Element Without Children Text
Injecting a Mock into an Angularjs Service
JavaScript Get Textarea Input via .Value or .Innerhtml
How to Add Text Inside the Doughnut Chart Using Chart.Js
How to Check All Checkboxes Using Jquery