Skip to content

Understanding "Property of Undefined" TypeError in JavaScript

3 min read

You're likely here because you've run across this all-too-familiar JavaScript error message:

TypeError: can't access property "value" of undefined

While the message seems clear, its wording can be misleading and leave you confused.

You're not alone, even seasoned developers occasionally trip up when they encounter this.

This is a common error in JavaScript, and you'll see it frequently in your web development career. The sooner you understand it, the less time you'll waste chasing the bug in the wrong places.

Let's examine this error message and reveal what it's really trying to tell us.

Decoding the error message

To better understand this error, or its equivalent, cannot read properties of undefined (reading "value"), it's crucial to analyze the error message in detail.

The irony is that the message contains all the information you need—it's just that, more often than not, developers gloss over it.

Suppose you have a user variable that's supposed to be an object and you're trying to access the name property:

console.log(user.name); // TypeError: can't access property "name" of undefined

At first glance, you might suspect that name is undefined.

However, if that were the case, JavaScript would simply return undefined. Nothing wrong with that:

const user = {};
console.log(user.name); // undefined

In reality, the issue lies one level higher—it's the parent user object that's undefined:

let user; // undefined
console.log(user.name); // TypeError: can't access property "name" of undefined

When you attempt to access a property on undefined type in JavaScript, the program throws a TypeError.

MDN describes a TypeError as:

The TypeError object represents an error when an operation could not be performed, typically (but not exclusively) when a value is not of the expected type.

So we end up doing undefined.name which doesn't make sense because undefined is not of type Object.

Understanding the hidden message

When the error says can't access property "name" of undefined, it's really saying: "Hey, the object you're trying to read name from? Yeah, that one's undefined."

You shouldn't focus on name, but on its parent object. It's about where you're pulling name from.

What confuses many developers is that the error message doesn't show the name of the parent object which is causing the issue. Most developers tend to skim through the error, catch sight of the variable name, and wrongly assume that's where the problem lies.

Line and column numbers are your friends

Error messages come with a stack trace that does us a favor by displaying the line and column number where the error originated. The key to tracing any bug is to read the line and column numbers in the stack trace and navigate to that location in your project.

For example, when I run this code:

let x;
console.log(x.value);

I get the following output:

TypeError: Cannot read properties of undefined (reading 'value')
    at file:///Users/maxim/Code/playground/test.js:2:15

The error message tells me the problem lies in the test.js file on line 2, column 15. This points directly to the dot notation, offering a clue about where the problem is:

let x;
console.log(x.value);
          // ^ line 2, column 15

Question your assumptions

Ultimately, effective debugging involves questioning your initial assumptions.

Within that questioning, we often find that we've made a wrong assumption that led us to reason about the code in the wrong way.

A bug is a difference between what we expect the program to do and what it actually does.

So the next time this confusing error pops up, you'll know exactly what to look for. It's this level of understanding that sets you apart as a developer.

Remember, we all make mistakes, but it's how we learn from them that defines us as developers. Happy debugging! 🐞 🚫

Write clean code. Stay ahead of the curve.

Every other Tuesday, I share tips on how to build robust Node.js applications. Join a community of 1,423 developers committed to advancing their careers and gain the knowledge & skills you need to succeed.

No spam! 🙅🏻‍♀️ Unsubscribe at any time.

You might also like

Why Your calc() Function in CSS Might Be Broken

You've fiddled with calc() a dozen times. Learn the common mistake devs make with math in CSS and finally fix your issue.
Read article

Getting Started with Eleventy

My notes on the Egghead course "Getting Started with Eleventy" by Khaled Garbaya.
Read article

A Memory Trick To Remember When to Use for...of vs for...in

When should you use for...of vs for...in? This neat memory trick has saved me countless Google searches.
Read article