String concatenation is hard. Take this code for example.

function makeGreeting (name, email, id) {
return 'Hello, ' + name +
'. We\'ve emailed you at ' + email +
'. Your user id is "' + id + '".'
}

All we're trying to do is take three variables (name, email, and id) and create a sentence using them. Sadly, in order to do that, it's a balancing act between using the right quotations, + signs, and escaping (\) the right characters. This is the exact problem that Template Literals (also called Template Strings) was created to solve.

With Template Literals, instead of using single ('') or double quotes (""), you use backticks (``) (located to the left of the 1 key if you're using a QWERTY keyboard 🙂). Anywhere inside of your backticks where you have an expression (a piece of code that results in a single value like a variable or function invocation), you can wrap that expression in ${expression goes here}.

So using Template Literals, we can take the confusing makeGreeting function above and simplify it to look like this.

function makeGreeting (name, email, id) {
return `Hello, ${name}. We've emailed you at ${email}. Your user id is "${id}".`
}

Much better. No more worrying about using the right quotations, + signs, and escaping the right characters. Not only is it easier to write, but it's also much easier to read.

Now instead of having a makeGreeting function, say we wanted a makeGreetingTemplate function that returned us an HTML string that we could throw into the DOM. Without template strings, we'd have something like this.

function makeGreetingTemplate (name, email, id) {
return '<div>' +
'<h1>Hello, ' + name + '.</h1>' +
'<p>We\'ve emailed you at ' + email + '. ' +
'Your user id is "' + id + '".</p>' +
'</div>'
}

Perfect, except for the fact that not only is it terribly hard to write, it's even harder to read. What's nice about ES6's Template Strings is they also support multi-line strings. That means, using Template Strings, we can rewrite makeGreetingTemplate to look like this.

function makeGreetingTemplate (name, email, id) {
return `
<div>
<h1>Hello, ${name}</h1>
<p>
We've email you at ${email}.
Your user id is "${id}".
</p>
</div>
`
}

I consider that an absolute win.