DEV Community

Cover image for JS issues at work - Issue 1 Fixing [object Object]
Saugandh Karan
Saugandh Karan

Posted on • Updated on

JS issues at work - Issue 1 Fixing [object Object]

TL;DR: This is a part one of the series 'JS issues at work', which explains how to solve [object Object] issues while using JS in day to day work.

Hello there 👋 I am a JS developer and have an experience of more than 6+ years. This is my very first blog and I started blogging so that I can journal my experience and others can also benefit from my learnings.

I found that learning something and applying that knowledge are two different things. So in this series, I would try my best to provide scenarios which we face in our day to day work and how we can solve that by applying our learnings.

Without much further ado, let's get started. Before we start remember:

💡 Finding solutions fast is good, but understanding the issue and why the solution worked is more important.

Prerequisites:

  • Basic knowledge of JS
  • Basic knowledge of working with JSON

🚨 Scenario:
When starting as a JS developer, we are very much dependent on alert() and console.log() to debug. In real life many a times we need to work with nested objects like this :

const nestedObject = {
    "step1": {
        "item1": "Item one of step one",
        "item2": "Item two of step one"
    }
}
Enter fullscreen mode Exit fullscreen mode

Let's assume that we need to check what the items are inside step1. When using console.log() we would see something like this:

console.log(nestedObject.step1)
// Output:
//    {
//        "item1": "Item one of step one",
//        "item2": "Item two of step one"
//    }
Enter fullscreen mode Exit fullscreen mode

But something interesting happens when we use alert(nestedObject.step1). We will see something like:
Image description
What happened here? And why was [object Object] printed instead of the actual output?

💊 Solution: We can see the actual object while using alert() is if we use:

alert(JSON.stringify(nestedObject.step1));
Enter fullscreen mode Exit fullscreen mode

Voila!!🎉 You will see it works and the result would look like this:
Image description

👨‍🏫️ Understanding the issue and reason the solution works:

alert() is a WebAPI and it accepts an optional parameter which is a string, or alternatively an object that is converted into string and displayed. source

So when we try to print an object using alert(), it converts the object as a string directly and prints it. The default conversion of any object to string is [object Object]. We can replicate this now in console.log() as well.

console.log(nestedObject.step1.toString());
// Output
// [object Object]
Enter fullscreen mode Exit fullscreen mode

So now we know why we see [object Object] instead of the actual object while using alert().

JSON.stringify() converts the JSON to a JSON string and returns the value, optionally replacing values if a replacer function is specified or optionally including only the specified properties if a replacer array is specified. source
So the object is not directly converted to string using toString().

So the output of using JSON.stringify() is a JSON string which is a string but not converted to [object Object].

const convertedObject = JSON.stringify(nestedObject);

console.log(convertedObject);
// output
'{"step1":{"item1":"Item one of step one","item2":"Item two of step one"}}'

console.log(typeof convertedObject);
// output
// string
Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
rolfst profile image
Rolf Strijdhorst

Hi Saugandh, you could also lead the beginners to: developer.mozilla.org/en-US/docs/W... and developer.mozilla.org/en-US/docs/W.... And learn them to read the docs ;-)