Skip to main content

Command Palette

Search for a command to run...

Template Literals in JavaScript

Updated
8 min read
Template Literals in JavaScript
H
CS undergrad | Tech enthusiast | Focusing on Web Dev • DSA • ML | Building skills for real-world impact

String concatenation might be the most annoying part of JavaScript. You build a string by gluing variables and text together with plus signs, keep track of quotes, worry about spacing, and end up with code that's hard to read and easy to break.

Template literals fix this. Once you start using them, you'll wonder how you ever tolerated the old way.

This is about what makes concatenation painful, how template literals solve it, and when they actually matter in real projects.


Problems with Traditional String Concatenation

The Plus Sign Problem

Before template literals, you built strings like this:

let name = "Alice";
let age = 25;

let message = "Hello, " + name + "! You are " + age + " years old.";
console.log(message); // Hello, Alice! You are 25 years old.

It works, but you have to be careful about spacing inside the strings, matching quotes, and remembering where each variable goes. That's three things to think about when you should only be thinking about one.

It Gets Worse with Longer Strings

Add more variables and things fall apart:

let user = "Bob";
let email = "bob@example.com";
let joinDate = "March 2024";
let role = "Developer";

let bio = "User: " + user + "\n" +
          "Email: " + email + "\n" +
          "Joined: " + joinDate + "\n" +
          "Role: " + role;

Now you're juggling quotes, newline characters, plus signs, and trying to picture what the final string actually looks like. It's hard to read the structure. Easy to miss a space.


Template Literal Syntax

Template literals use backticks (`) instead of quotes. You put variables inside ${} and they get inserted directly.

Basic Example

let name = "Alice";
let age = 25;

let message = `Hello, \({name}! You are \){age} years old.`;
console.log(message); // Hello, Alice! You are 25 years old.

Compare the two approaches:

// Old way (concatenation)
let greeting = "Hello, " + name;

// New way (template literal)
let greeting = `Hello, ${name}`;

The template literal reads naturally. The variable shows up right where it goes.


Embedding Variables in Strings

Variables and Expressions

You can put any JavaScript expression inside ${}:

let x = 5;
let y = 3;

console.log(`\({x} + \){y} = ${x + y}`);
// 5 + 3 = 8

Objects and Properties

let user = {
  name: "Charlie",
  email: "charlie@example.com",
  role: "Admin"
};

let profile = `User: \({user.name}, Email: \){user.email}, Role: ${user.role}`;
console.log(profile);
// User: Charlie, Email: charlie@example.com, Role: Admin

Function Calls

function getGreeting(hour) {
  if (hour < 12) return "Good morning";
  if (hour < 18) return "Good afternoon";
  return "Good evening";
}

let greeting = `${getGreeting(10)}, it's a beautiful day!`;
console.log(greeting); // Good morning, it's a beautiful day!

Ternary Operators

let score = 85;
let result = `Your score is \({score}. \){score >= 80 ? "You passed!" : "You failed."}`;
console.log(result); // Your score is 85. You passed!

Arrays

let colors = ["red", "green", "blue"];
let colorList = `Available colors: ${colors.join(", ")}`;
console.log(colorList); // Available colors: red, green, blue

Multi-line Strings

The Old Way Was Painful

Creating multi-line strings meant either concatenating or using \n:

let html = "<div>" +
           "  <h1>Hello</h1>" +
           "  <p>This is a paragraph</p>" +
           "</div>";

// or

let html = "<div>\n  <h1>Hello</h1>\n  <p>This is a paragraph</p>\n</div>";

Both are annoying to read and write.

Template Literals Handle It Naturally

let html = `<div>
  <h1>Hello</h1>
  <p>This is a paragraph</p>
</div>`;

console.log(html);

The newlines are preserved exactly as you type them.

With Variables

let name = "Alice";
let age = 25;

let profile = `
Name: ${name}
Age: ${age}
Status: Active
`;

Real HTML Template

let title = "Welcome";
let content = "This is my website";

let page = `<!DOCTYPE html>
<html>
  <head>
    <title>${title}</title>
  </head>
  <body>
    <h1>${title}</h1>
    <p>${content}</p>
  </body>
</html>`;

String Interpolation Visualization

How template literals work:

Template Literal:
`Hello, \({name}! You are \){age} years old.`
           |                    |
           |                    |
         name = "Alice"    age = 25
           |                    |
           v                    v
Result: "Hello, Alice! You are 25 years old."

The ${} acts as a placeholder. Whatever expression is inside gets evaluated and inserted into the string.

Before vs After

BEFORE (Concatenation):
"Hello, " + name + "! You are " + age + " years old."
 |string|  |var|   |string|     |var|  |string|
  Hard to read, easy to make mistakes

AFTER (Template Literal):
`Hello, \({name}! You are \){age} years old.`
         |variable|            |variable|
  Clear structure, reads naturally

Before vs After Template Literals

Simple Greeting

Concatenation:

let user = "Bob";
let hour = 10;
let greeting = "Hello " + user + ", good " + (hour < 12 ? "morning" : "afternoon") + "!";

Template literal:

let user = "Bob";
let hour = 10;
let greeting = `Hello \({user}, good \){hour < 12 ? "morning" : "afternoon"}!`;

The template literal reads closer to how you'd actually think about the string.

User Profile

Concatenation:

let firstName = "John";
let lastName = "Doe";
let email = "john@example.com";
let joinDate = "2023-01-15";

let profile = "Name: " + firstName + " " + lastName + "\n" +
              "Email: " + email + "\n" +
              "Joined: " + joinDate;

Template literal:

let firstName = "John";
let lastName = "Doe";
let email = "john@example.com";
let joinDate = "2023-01-15";

let profile = `
Name: \({firstName} \){lastName}
Email: ${email}
Joined: ${joinDate}
`;

The template shows the actual structure immediately.

HTML Snippet

Concatenation:

let heading = "Welcome";
let paragraph = "This is the content";

let html = "<div class=\"container\">" +
           "<h1>" + heading + "</h1>" +
           "<p>" + paragraph + "</p>" +
           "</div>";

Template literal:

let heading = "Welcome";
let paragraph = "This is the content";

let html = `<div class="container">
  <h1>${heading}</h1>
  <p>${paragraph}</p>
</div>`;

No quote escaping. No newline characters. You write the HTML as you see it.


Use Cases in Modern JavaScript

Building HTML Dynamically

let products = [
  { name: "Laptop", price: 1000 },
  { name: "Phone", price: 500 }
];

let html = `<ul>
  \({products.map(p => `<li>\){p.name}: $${p.price}</li>`).join("")}
</ul>`;

console.log(html);

This is how you actually see it written.

URLs and API Requests

let userId = 42;
let token = "abc123xyz";

let url = `https://api.example.com/users/\({userId}/profile?token=\){token}`;

Much clearer than building strings with plus signs.

Error Messages and Logging

let filename = "data.txt";
let error = "File not found";

console.error(`Error: Could not load \({filename}. Reason: \){error}`);

Working with JSON Data

let name = "Bob";
let email = "bob@example.com";

let jsonData = `{
  "name": "${name}",
  "email": "${email}",
  "timestamp": "${new Date().toISOString()}"
}`;

console.log(jsonData);

Template Literals vs Regular Strings

Feature Regular Strings Template Literals
Quotes Single or double Backticks
Variables Concatenation with + ${} syntax
Expressions Can't embed directly Full JavaScript expressions
Multi-line Need \n or concatenation Preserve newlines naturally
Readability Gets messy with many variables Stays clean
Performance Slightly faster Negligible difference
Backwards compatible Yes IE 11+ required

Practice Assignment

Work through these exercises:

1. Convert concatenation to template literals:

let city = "New York";
let population = 8000000;

// Old way:
let fact = "The population of " + city + " is about " + population + ".";

// Convert to template literal

2. Build an email template:

let recipient = "alice@example.com";
let subject = "Welcome!";
let senderName = "Support Team";

// Create an email template with greeting, body, and signature
// Use template literals

3. Create an HTML form:

let formTitle = "Contact Us";
let submitText = "Send Message";

// Build HTML for a contact form using template literals
// Include fields for name, email, and message

4. Format data with expressions:

let items = [
  { name: "Apple", quantity: 5 },
  { name: "Banana", quantity: 3 }
];

// Create a shopping list display using template literals
// Show: "Apple x 5", "Banana x 3", etc.

5. Multi-line SQL-like query:

let tableName = "users";
let condition = "age > 18";
let limit = 10;

// Build a multi-line query string using template literals

Quick Recap

  • Traditional plus-sign concatenation becomes unreadable with multiple variables

  • Template literals use backticks (`) instead of quotes

  • Variables go inside ${} and get inserted directly

  • Any JavaScript expression works inside ${}

  • Multi-line strings preserve newlines and spacing naturally

  • No quote escaping needed

  • Supported in all modern browsers and Node.js

Once you start using template literals, string concatenation feels painful. If you're not using them yet, start with your next string that has more than one variable. You'll notice immediately how much cleaner the code is.

Happy coding! 🚀


If you enjoyed this article, check out my other blogs on this profile. 🔗 Connect with me: LinkedIn | GitHub | X (Twitter)