Can I use ES6 template strings to pretty print javascript objects? This is from a React Native project, with console.log()
outputting to Chrome debugging tools.
const description = 'App opened'; const properties = { key1: 'val1', blah: 123 }; console.log('Description: ', description, '. Properties: ', properties);
outputs
// Same description and properties const logString = `Description: ${description}. Properties: ${properties}`; console.log(logString);
outputs
How do I get the first output (with the pretty printing) using template strings?
Template strings are now an order of magnitude faster than string concatenation. See version 14 of the given jsperf, it is the most accurate & unbiased one can technically get while retaining feature aspects.
Template strings are a powerful feature of modern JavaScript released in ES6. It lets us insert/interpolate variables and expressions into strings without needing to concatenate like in older versions of JavaScript. It allows us to create strings that are complex and contain dynamic elements.
Template literals are sometimes informally called template strings, because they are used most commonly for string interpolation (to create strings by doing substitution of placeholders).
Template literals are a new feature introduced in ECMAScript 2015/ ES6. It provides an easy way to create multiline strings and perform string interpolation. Template literals are the string literals and allow embedded expressions. Before ES6, template literals were called as template strings.
Your first example does not actually output a string
to the console
. Notice how properties
is passed as a separate parameter argument (as it is surrounded by commas ,
and not string-concatenation operators +
).
When you pass an object
(or any JavaScript value) to console
as a discrete argument it can display it how it wishes - including as an interactive formatted display, which it does in your first example.
In your second example, you're using templated-strings, but it's (generally) equivalent to this:
logString = "Description: " + description.toString() + ". Properties: " + properties.toString()";
And Object.prototype.toString()
returns "[object Object]"
by default. Note that this is a string
value which is not particularly useful.
In order to get a JSON (literally JavaScript Object Notation) representation of an object used in a templated string use JSON.stringify
:
logString = `Description: ${ description }. Properties: ${ JSON.stringify( properties ) }.`
Or consider extending toString
for your own types:
myPropertiesConstructor.prototype.toString = function() { return JSON.stringify( this ); };
Can I use ES6 template strings to pretty print javascript objects?
Sure, but you have to convert the object to a pretty printed version before you pass it to the template literal (I'm sure there are libraries out there that do that. The poor man's version is JSON.stringify(obj, null, 2)
).
However, since console.log
accepts an arbitrary number of arguments, you should just pass the object as second argument so that it doesn't get converted to a string:
const logString = `Description: ${description}. Properties:`; console.log(logString, properties);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With