JavaScript Debugging Tip: Objects

By  on  

Every so often I want to view what an object looks like at various points of an execution cycle.  Many people like to use breakpoint debugging but I find it a bit annoying and tedious -- it's simply not for me.  The problem comes when I log an object to the console; since other operations may have occurred between my log call and the rest of execution, I may not be seeing a true representation of the object at that moment within the console.  There are a few solutions you can employ:

The first solution is converting the object to a JSON string to browse its contents:

// Log the JSON representation of this object 
// at *this* moment
console.log(JSON.stringify(myObject));

Now I can see every key and value of the object without needing to click around it.  If you prefer to work with a real object in the debugger, simply convert the JSON object from string to an object again, effectively cloning it:

// Object -> String -> Object (clone)
console.log(JSON.parse(JSON.stringify(myObject)));

Of coures this isn't a perfect solution for some people but it has worked beautifully for me in the past.  Maybe I'm a lesser programmer for not liking breakpoint debugging but hey -- I tend to get things done!

Recent Features

  • By
    Write Simple, Elegant and Maintainable Media Queries with Sass

    I spent a few months experimenting with different approaches for writing simple, elegant and maintainable media queries with Sass. Each solution had something that I really liked, but I couldn't find one that covered everything I needed to do, so I ventured into creating my...

  • By
    Create Namespaced Classes with MooTools

    MooTools has always gotten a bit of grief for not inherently using and standardizing namespaced-based JavaScript classes like the Dojo Toolkit does.  Many developers create their classes as globals which is generally frowned up.  I mostly disagree with that stance, but each to their own.  In any event...

Incredible Demos

  • By
    Pure CSS Slide Up and Slide Down

    If I can avoid using JavaScript for element animations, I'm incredibly happy and driven to do so.  They're more efficient, don't require a JavaScript framework to manage steps, and they're more elegant.  One effect that is difficult to nail down with pure CSS is sliding up...

  • By
    MooTools Equal Heights Plugin:  Equalizer

    Keeping equal heights between elements within the same container can be hugely important for the sake of a pretty page. Unfortunately sometimes keeping columns the same height can't be done with CSS -- you need a little help from your JavaScript friends. Well...now you're...

Discussion

  1. MaxArt

    Chrome has a mixed behavior: it displays the first 5 properties of the object at runtime, but when you expand it it shows the property values at interaction time. So it’s not necessary for simple objects.

    Note: the trick does *not* work in Internet Explorer. It would just log [object Object] in the console.
    Why am I not surprised?

  2. Cristian

    If you would get a better readibility using JSON.stringify, use something like that:

    JSON.stringify(myObject, null, '  ')

    The last parameter is the caracter/s to indent the stringified object.

  3. @MaxArt, try console.dir instead of console.log for Internet Explorer.

    • @Jack Moore – did not know that. Very useful! Thanks!

    • @Jack Moore – Very useful Jack!

    • Thats something new and very useful :) thanks Jack.

  4. deemyBoy

    @OP (David Walsh)

    I don’t get this –> Now I can see every key and value of the object without needing to click around it. If you prefer to work with a real object in the debugger, simply convert the JSON object from string to an object again, effectively cloning it:

    If you already have a JSON object then why you need to clone it?

    Raises lots of questions in my noobie mind!!!

    Primary level (or direct) questions:
    ————————————
    If you clone it do you now have 2 copies?
    How do you rename the 2nd copy?
    Where is the 2nd copy stored?
    How do you access it?

    Secondary questions:
    ——————–
    Does this make maintenance a headache?
    Can any (desired) modifications/updates be overwritten so rendering cloning pointless?
    How do specify which you are using (original or clone)?

    Why do people just throw stuff out there such as “effectively cloning it” without either explaining the implications themselves or linking to articles or sites that explain it!?

    Is cloning god/bad?
    Is it best practise?
    Cloning explained –>

    Etc., etc.

    Used it btw and could finally “see” my object instead of “[Object, Object, Object, Object, Object]” so guess I owe you a big thanks for this on the most part.

    If you could add further clarification about cloning that would be good.

    In my mind if have an object and realise I don’t want to JSON.stringify it anymore the rather than doing:

    console.log(JSON.parse(JSON.stringify(myObject)));
    

    I just do:

    console.log(myObject);
    

    Does that make sense?
    In essence, I already have my object so why stringify and parse it to get back to where I was in the first place???????
    ??????
    ??????

  5. console.log("%j", myObject); or console.dir(myObject)

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!