Skip to content Skip to footer

JavaScript’s isNull or Lack Thereof: Navigating Null and Undefined

Ahoy, JavaScript adventurers! If you’ve been around the block a few times with JavaScript, you know that dealing with null and undefined can sometimes feel like a walk on a tightrope. But fear not! Today, we’re diving into the nitty-gritty of what JavaScript has (or hasn’t) in terms of an isNull function and how you can effectively manage nullish values in your code.

The null and undefined Conundrum

First off, let’s get one thing straight: JavaScript doesn’t have an isNull function out of the box. I know, shocking, right? But that’s the quirky nature of JS for you. Instead, we have null and undefined as two distinct types that represent the absence of a value in different flavors.

let ghostVariable; // This bad boy is undefined
let emptyCup = null; // This one's null and knows it

undefined is the default absence of value, while null is the intentional absence of value. They’re like the two sides of a magic coin that sometimes vanishes when you’re not looking.

Checking for null in Vanilla JavaScript

Since JavaScript doesn’t hand us an isNull on a silver platter, we gotta roll up our sleeves and check for null ourselves. Here’s the old-school way to do it:

function isNull(value) {
  return value === null;
}

console.log(isNull(emptyCup)); // true
console.log(isNull(ghostVariable)); // false

Simple and straightforward, right? This little helper function just checks if the value strictly equals null. It’s the triple equals === that does the heavy lifting by ensuring that we’re not just dealing with a falsy value but the real null deal.

Embracing the Nullish Coalescing Operator ??

Enter the nullish coalescing operator ??, a shiny addition to JavaScript’s operator lineup. It’s like a bouncer that only lets null or undefined through to trigger a default value.

let thirstyGuest = null;
let drink = thirstyGuest ?? 'Water';

console.log(drink); // 'Water'

With ??, we’re basically saying, “Hey, if thirstyGuest is null or undefined, let’s give them some water.” It’s a neat way to provide fallbacks without mistaking other falsy values (like 0, '', or false) for null or undefined.

Lodash to the Rescue

While we’re all about that vanilla JavaScript life, sometimes it’s nice to have a little help from our friends. Lodash, a popular utility library, has a function called _.isNull() that does exactly what you’d expect.

import _ from 'lodash';

console.log(_.isNull(emptyCup)); // true
console.log(_.isNull(ghostVariable)); // false

Lodash’s _.isNull() is like having a trusty sidekick that’s got your back when you need to check for null specifically. Plus, it makes your code look clean and your intentions clear.

React and the Null Prophecy

When you’re working with React, handling null values is part of the daily grind. React is chill with null and treats it as a way to say “render nothing here, buddy.”

function WelcomeBanner({ user }) {
  if (user === null) {
    return null; // Render nothing if there's no user
  }
  return <h1>Welcome, {user.name}!</h1>;
}

In this snippet, we’re using a simple strict equality check to determine if user is null. If it is, we return null from the component, and React renders nada, zip, zilch.

Angular’s Existential Crisis

Angular developers, you’re not left out of the null party. Angular’s template syntax provides some nifty ways to handle null values right in your HTML templates with the safe navigation operator ?..

<p>Hello, {{ user?.name }}!</p>

This ?. operator is like a polite inquiry. It asks, “Hey, does user exist? If so, can I see name?” If user is null or undefined, Angular won’t throw a fit and will just render the template without the user.name.

Vue’s Computed Properties and Null Checks

Over in Vue land, we can elegantly handle null values with computed properties. These are like smart properties that automatically update when their dependencies change.

computed: {
  fullName() {
    return this.user === null ? '' : `${this.user.firstName} ${this.user.lastName}`;
  }
}

Here, we’re using a ternary operator to check if this.user is null. If it is, we return an empty string; otherwise, we return the user’s full name. Vue’s reactivity system takes care of the rest, ensuring our fullName stays up-to-date.


Alright, code wranglers, that’s the first half of our journey into the land of JavaScript’s null and undefined. We’ve covered the basics, some handy operators, and how different frameworks handle the absence of value. Stay tuned for the second half, where we’ll dive even deeper and explore more advanced techniques and best practices for dealing with null in JavaScript. Keep your coding tools at the ready!

When it comes to Node.js, our server-side JavaScript environment, the story of null continues. Since Node.js runs on the V8 engine (same as in the browser), all the principles we’ve discussed hold true. However, on the backend, you often deal with databases, APIs, and other systems where null can pop up in unexpected ways.

Dealing with Null in Asynchronous Operations

In Node.js, you’ll frequently find yourself in the land of asynchronous operations, where you query a database or an external API. Here’s how you might handle null values in an async function:

async function getUser(id) {
  const user = await database.findUserById(id);
  if (user === null) {
    throw new Error('User not found!');
  }
  return user;
}

In this async function, we’re awaiting the result of a database query. If the user doesn’t exist, our findUserById might return null, and we handle that by throwing an error.

Express Middleware and the Null Void

When working with Express, a popular Node.js framework, middleware functions can encounter null values in request parameters or the response object. It’s important to handle these cases to avoid server crashes.

app.get('/users/:id', async (req, res, next) => {
  try {
    const user = await getUser(req.params.id);
    res.json(user);
  } catch (error) {
    next(error);
  }
});

In the above route handler, if getUser throws an error (possibly due to a null user), we catch it and pass it along to the next error-handling middleware.

TypeScript: The Null Slayer

TypeScript, the statically typed superset of JavaScript, offers a more robust way to handle null and undefined through its type system. By default, TypeScript is strict with null and undefined, and you have to explicitly account for them in your types.

function greet(name: string | null) {
  if (name === null) {
    console.log('Hello, stranger!');
  } else {
    console.log(`Hello, ${name}!`);
  }
}

Here, the type string | null indicates that name can be either a string or null. TypeScript forces us to handle the null case, making our code more predictable and less prone to null reference errors.

Jest and the Art of Null Testing

Testing frameworks like Jest make it easy to write tests that specifically check for null values. Ensuring your functions behave correctly with null inputs is a key part of robust testing strategies.

test('getUser returns null for non-existing user', async () => {
  await expect(getUser('nonExistingId')).resolves.toBeNull();
});

In this Jest test, we’re asserting that getUser should resolve to null when called with a non-existing user ID. Jest provides the .toBeNull() matcher for these exact scenarios.

The Power of Optional Chaining ?.

Optional chaining ?. is another ECMAScript feature that simplifies the process of dealing with null and undefined. It allows you to read the value of a property located deep within a chain of connected objects without having to expressly validate each reference in the chain.

const address = user?.contactInfo?.address;

With optional chaining, if contactInfo is null or undefined, address will be undefined too, and no error will be thrown. It’s a clean and safe way to attempt to access deeply nested properties.

The Future: Nullish Assignment ??=

Looking ahead, the nullish assignment operator ??= is on the horizon. It assigns a value to a variable only if that variable is currently null or undefined.

let theme;
theme ??= 'dark mode'; // theme is now 'dark mode'

theme = 'light mode';
theme ??= 'dark mode'; // theme remains 'light mode'

This operator is particularly useful for setting default values for variables that may not have been initialized yet.


And there you have it, fellow coders—the full story of null in JavaScript, from the front end to the back end, and from vanilla JS to the latest framework features. Whether you’re checking for null, handling it gracefully, or setting default values, it’s clear that null is an integral part of the JavaScript universe. Embrace it, understand it, and write code that’s robust in the face of the great nothingness that null represents. Happy coding, and may your variables always be non-null when you need them to be!