Шаблонные строки: интерполяция и tagged templates

Шаблонные строки: мощь и элегантность

Шаблонные строки (template literals) — это не просто замена кавычкам. Они открывают новые возможности для работы со строками в JavaScript. Давай разберёмся, как использовать их на полную!

const name = "Данила";
console.log(`Привет, ${name}!`); // "Привет, Данила!"

Интерполяция: вставляем переменные прямо в строки 💉

Раньше для объединения строк и переменных приходилось использовать конкатенацию (+). Теперь всё проще:

const product = "кофе";
const price = 120;

// Старый способ (уже не модно 😅)
console.log("Цена " + product + ": " + price + " руб.");

// Новый способ — чисто и читаемо!
console.log(`Цена ${product}: ${price} руб.`);

💡 Внутри ${} можно писать любые выражения JavaScript: javascript console.log(`Сумма: ${2 + 3}`); // "Сумма: 5"


Многострочные строки без костылей 📜

Раньше для переносов строк использовали \n или конкатенацию. Теперь просто пишем как есть:

// Старый способ
const oldStr = "Первая строка\n" + 
               "Вторая строка";

// Новый способ — элегантно!
const newStr = `Первая строка
Вторая строка`;

Отлично подходит для HTML-шаблонов:

const user = { name: "Анна", age: 25 };
const html = `
  <div class="user">
    <h2>${user.name}</h2>
    <p>Возраст: ${user.age}</p>
  </div>
`;

Tagged Templates: продвинутый уровень 🔥

Это мощная фишка, которая позволяет обрабатывать шаблонные строки через функцию. Выглядит необычно, но очень полезно!

Как это работает?

Функция-тег получает:

  1. Массив строковых частей (разделённых ${})
  2. Значения всех вставок (то, что внутри ${})
function highlight(strings, ...values) {
  let result = "";

  strings.forEach((str, i) => {
    result += str;
    if (values[i]) {
      result += `<mark>${values[i]}</mark>`;
    }
  });

  return result;
}

const name = "Данила";
const age = 30;

console.log(highlight`Привет, ${name}! Тебе ${age} лет.`);
// "Привет, <mark>Данила</mark>! Тебе <mark>30</mark> лет."

Где это применяется?

  1. Экранирование HTML (защита от XSS)
  2. Интернационализация (i18n)
  3. Стилизация строк (как в примере выше)
  4. Сложные логические операции с шаблонами

Практические примеры из жизни ️

1. Форматирование валюты

function formatCurrency(strings, ...values) {
  const str = strings.reduce((result, str, i) => {
    let value = values[i] || "";
    if (typeof value === "number") {
      value = value.toFixed(2);
    }
    return result + str + value;
  }, "");

  return str;
}

const price = 99.9;
console.log(formatCurrency`Цена: ${price} руб.`); // "Цена: 99.90 руб."

2. Шаблонизатор запросов SQL

function sqlQuery(strings, ...values) {
  // Здесь должна быть проверка на SQL-инъекции!
  return {
    query: strings.join("?"),
    params: values
  };
}

const userId = 42;
const query = sqlQuery`SELECT * FROM users WHERE id = ${userId}`;
console.log(query); // { query: "SELECT * FROM users WHERE id = ?", params: [42] }

⚠️ Важно! Это упрощённый пример. В реальном проекте всегда используйте параметризованные запросы или ORM.


Под капотом: как это устроено? 🔍

Когда JavaScript видит tagged template:

tag`Текст ${value} ещё текст`;

Он преобразует это в вызов функции:

tag(["Текст ", " ещё текст"], value);

То есть:

  1. Все статические части строки собираются в массив
  2. Все динамические выражения передаются как отдельные аргументы

Когда использовать, а когда нет? ⚖️

Используйте шаблонные строки, когда:

  • Нужна интерполяция переменных
  • Требуется многострочный текст
  • Хотите использовать tagged templates

Не используйте, когда:

  • Простая строка без переменных ('строка' быстрее, чем `строка`)
  • В высоконагруженных участках кода (микрооптимизации)

Продвинутые трюки для профи 🎩

1. Вложенные шаблонные строки

const items = ["🍎", "🍌", "🍊"];
console.log(`Список: ${items.map(item => `[${item}]`).join(", ")}`);
// "Список: [🍎], [🍌], [🍊]"

2. Тернарные операторы внутри

const score = 85;
console.log(`Результат: ${score > 80 ? "Отлично!" : "Можно лучше"}`);

3. Деструктуризация в tagged templates

function greet(strings, ...values) {
  const [name, age] = values;
  return `${strings[0]}${name}, тебе ${age} лет!`;
}

const user = ["Данила", 30];
console.log(greet`Привет, ${user[0]}! Тебе ${user[1]} лет.`);

Шаблонные строки — это один из тех инструментов, которые делают JavaScript современным и выразительным. Попробуй применить их в своём коде уже сегодня!

Скрыть рекламу навсегда

🧠 Учёба без воды и зубрёжки

Закрытый Boosty с наработками опытного преподавателя.

Объясняю сложное так, чтобы щелкнуло.

🚀 Забрать доступ к Boosty