Skip to main content
Madhukar
All Articles

Template Literals in JavaScript: A Readable Way to Build Strings

July 30, 20265 min read
JavaScriptEs6Web DevelopmentClean Code
Template Literals in JavaScript: A Readable Way to Build Strings

Problems With Traditional String Concatenation

Before template literals, building a string from a mix of fixed text and variable values meant stitching pieces together with the + operator:

const name = "Aarav";
const count = 3;

const message = "Hello, " + name + "! You have " + count + " new messages.";

This works — but it comes with real, accumulating friction:

Readability suffers quickly

Even in this simple example, the actual sentence being constructed gets buried under quotation marks and + signs — and it only gets harder to read as more variables get added.

Easy to introduce small mistakes

Forgetting a space inside one of the quoted segments ("Hello," instead of "Hello, ") silently produces "Hello,Aarav" instead of "Hello, Aarav" — a subtle bug that's easy to miss just by glancing at the code.

Multi-line strings are genuinely awkward

Building a multi-line string with plain concatenation means manually inserting "\n" characters, or joining separate strings with + across multiple lines — neither reads naturally as the multi-line text it's meant to represent.

const message =
"Dear " + name + ",\n" +
"Thank you for your order.\n" +
"Your total is $" + total + ".";

Template Literal Syntax

Template literals use backticks (`) instead of single or double quotes, and let you embed expressions directly inside the string using ${}:

const name = "Aarav";
const count = 3;

const message = `Hello, ${name}! You have ${count} new messages.`;

This single line reads exactly like the sentence it produces — no scattered + operators, no separately quoted fragments to mentally reassemble.

Embedding Variables in Strings

Anything inside ${} is evaluated as a real JavaScript expression, not just a plain variable name — meaning you can embed calculations, function calls, or conditional logic directly:

const price = 49.99;
const quantity = 3;

console.log(`Total: $${(price * quantity).toFixed(2)}`);
// "Total: $149.97"

function getGreeting(hour) {
return hour < 12 ? "Good morning" : "Good evening";
}

console.log(`${getGreeting(9)}, ${name}!`);
// "Good morning, Aarav!"

This is often called string interpolation — inserting a value directly into a specific position within a string, evaluated at the moment the template literal runs.

You can embed as many expressions as needed, in any order:

const user = { name: "Priya", role: "admin" };

console.log(`${user.name} is logged in as ${user.role.toUpperCase()}.`);
// "Priya is logged in as ADMIN."

Multi-Line Strings

Template literals support line breaks directly inside the backticks, exactly as typed — no special escape characters needed:

const message = `Dear ${name},

Thank you for your order.
Your total is $${total}.

Best regards,
The Team`;

Compare this to the concatenation version from earlier — the template literal version reads exactly like the finished message, formatted the same way it will actually appear.

// Old way: manual "\n" characters, harder to visualize
const oldMessage = "Dear " + name + ",\n\nThank you for your order.\n" +
"Your total is $" + total + ".\n\nBest regards,\nThe Team";

// Template literal: looks exactly like the output
const newMessage = `Dear ${name},

Thank you for your order.
Your total is $${total}.

Best regards,
The Team`;

This is especially useful for generating emails, formatted console output, or any multi-line text where matching the actual intended layout in the code itself makes it much easier to verify correctness at a glance.

Use Cases in Modern JavaScript

Building dynamic UI strings

const cardHTML = `
<div class="card">
<h2>${product.name}</h2>
<p>$${product.price}</p>
</div>
`;

Embedding dynamic data directly into HTML-like strings is a common pattern, especially before or alongside dedicated templating tools.

Constructing URLs and API endpoints

const userId = 42;
const endpoint = `https://api.example.com/users/${userId}/orders`;

Logging and debugging output

console.log(`Fetching data for user ${userId} at ${new Date().toISOString()}`);

Conditional content within a string

const itemCount = 5;
console.log(`You have ${itemCount} item${itemCount !== 1 ? "s" : ""} in your cart.`);

Tagged templates (a more advanced use case)

Template literals also support tagged templates — a function placed right before the backticks that can process the string and embedded values before producing the final result. This is a more advanced pattern (commonly used by certain styling and internationalization libraries) worth knowing exists, even if it’s less common in everyday code than basic interpolation.

Before vs After, Side by Side

// Before: string concatenation
const summary = "Order #" + orderId + " for " + customerName +
" totals $" + total.toFixed(2) + ", shipped on " + shipDate + ".";

// After: template literal
const summary = `Order #${orderId} for ${customerName} totals $${total.toFixed(2)}, shipped on ${shipDate}.`;

The template literal version isn’t just shorter — it’s structurally easier to verify at a glance, since it visually resembles the sentence it actually produces, rather than requiring you to mentally reconstruct it from fragments joined by +.

Final Takeaway

Template literals solve a problem that’s easy to underestimate until you’ve debugged one too many misplaced spaces or missing + signs: building strings from a mix of fixed text and dynamic values shouldn't require reconstructing a sentence in your head from scattered fragments. Backticks and ${} let a string read like the sentence it actually represents — dynamic values embedded directly where they belong, multi-line text formatted exactly as it will appear, and full JavaScript expressions available anywhere interpolation is needed. It's a small syntax change with an outsized effect on how readable everyday string-building code actually is.

Frequently Asked Questions

Can I use regular quotes and template literals interchangeably?

> For static strings with no embedded values, yes — there’s no functional difference. Template literals become genuinely necessary the moment you need to embed a variable, expression, or a multi-line string.

Is there a performance cost to using template literals over concatenation?

> In practice, no meaningful difference exists for typical application code — the readability benefit is the primary reason to prefer them, not performance.

Can I nest template literals inside each other?

> Yes — a ${} expression can itself contain another template literal, though this is best used sparingly, since deeply nested interpolation can quickly become harder to read than the concatenation it was meant to replace.

Do template literals work in older browsers?

> Template literals are part of ES6 (2015) and are supported in all modern browsers and current Node.js versions. Extremely old browser support would require a transpiler like Babel, which is rarely a practical concern in current web development.

Originally published by Mr Madhukar

Read the complete article on Medium with full formatting & reader responses.