Template Literals

Модуль 1: Web Core
19 уровень , 2 лекция
Открыта

3.1 Вложенные выражения

В шаблонных литералах можно использовать любые выражения, включая вызовы функций, тернарные операторы и шаблонные литералы внутри шаблонных литералов.

Пример:

В выражении ${a + b} выполняется математическая операция, и результат вставляется в строку result.

JavaScript
    
      const a = 5;
      const b = 10;

      const result = `The result of ${a} + ${b} is ${a + b}.`;
      console.log(result); // "The result of 5 + 10 is 15."
    
  

3.2 Вложенные шаблонные литералы

Шаблонные литералы могут быть вложены, что позволяет создавать сложные строки.

Пример:

Вызов метода greet() объекта user вложен в шаблонный литерал message.

JavaScript
    
      const user = {
        name: 'Bob',
        age: 25,
        greet() {
          return `Hello, ${this.name}!`;
        }
      };

      const message = `${user.greet()} You are ${user.age} years old.`;

      console.log(message); // "Hello, Bob! You are 25 years old."
    
  

3.3 Тегированные шаблонные литералы (Tagged Templates)

Тегированные шаблонные литералы позволяют вызывать функцию для обработки шаблонных строк. Это дает возможность выполнять дополнительные манипуляции со строками, такие как интернационализация, безопасная вставка HTML и т. д.

Синтаксис:

    
      function tag(strings, ...values) {
        // обработка строк и значений
        return результат;
      }

      const result = tag`Шаблонная строка с ${переменная}`;
    
  

Пример:

Функция highlight() обрабатывает строки и значения, оборачивая значения в HTML-теги <span> с классом highlight.

JavaScript
    
      function highlight(strings, ...values) {
        return strings.reduce((result, str, i) =>
          `${result}${str}${values[i] || ''}`, '');
      }

      const name = 'Carol';
      const hobby = 'painting';
      const message = highlight`My name is ${name} and I love ${hobby}.`;

      console.log(message);
      // My name is Carol and I love painting.
    
  

3.4 Безопасная вставка значений

Шаблонные литералы помогают избежать некоторых распространенных проблем с безопасностью, таких как XSS (межсайтовый скриптинг), путем безопасной вставки значений. Это особенно полезно при вставке данных пользователя в HTML.

Пример:

Функция safeHTML() заменяет опасные символы в значениях, предотвращая XSS-атаки.

JavaScript
    
      function safeHTML(strings, ...values) {
        return strings.reduce((result, str, i) =>
          `${result}${str}${String(values[i]).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')}`, '');
      }

      const userInput = '<script>alert("XSS")</script>';
      const message = safeHTML`User input: ${userInput}`;

      console.log(message);
      // "User input: &lt;script&gt;alert("XSS")&lt;/script&gt;"
    
  
1
Задача
Модуль 1: Web Core, 19 уровень, 2 лекция
Недоступна
Математические шаблоны
Математические шаблоны
1
Задача
Модуль 1: Web Core, 19 уровень, 2 лекция
Недоступна
Форматирование текста
Форматирование текста
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Константин Уровень 57
7 мая 2025
Про тегирование (3.3) и вставку значений (3.4) ничего не понятно. 👎
Ivan Уровень 59
25 мая 2025
В функцию, которая является тегом, передаётся массив кусков строки между шаблонных литералов и массив значений, которые в эти шаблоны вставляются. Дальше с помощью циклов или метода reduce эти массивы можно перебрать и надругаться над строкой так как нам заблагорассудится. В результате надо вернуть новую строку.
Виктор Рябов Уровень 21
5 марта 2025
Вероника Уровень 49
17 февраля 2025
Функция highlight() обрабатывает строки и значения, оборачивая значения в HTML-теги с классом highlight.

function highlight(strings, ...values) {
  return strings.reduce((result, str, i) =>
    `${result}${str}${values[i] || ''}`, '');
}
Точно оборачивает?
Ivan Уровень 59
25 мая 2025
Наверное, как-то так должно быть:

function highlight(strings, ...values) {
  return strings.reduce((result, str, i) =>
    `${result}${str}'<span class="highlight">'${values[i] || ''}'</span>'`, '');
}
Только значений меньше, чем кусков строки. В результате пустое место в конце тоже оборачивается в span. И я не знаю, как это просто поправить. P.S. Нейросеть подсказала, что надо вот так переделать:

function highlight(strings, ...values) {
  return strings.reduce((result, str, i) => {
    const value = values[i] !== undefined ? `<span class="highlight">${values[i]}</span>` : '';
    return `${result}${str}${value}`;
  }, '');
}
Анастасия Уровень 27
15 августа 2025
Ну вот это больше на правду похоже, а то в примере функция описана, такая, что как будто и без неё так же будет работать. Я про вот такоий синтаксис:

const message = `My name is ${name} and I love ${hobby}.`;
Но вообще пример сложный, т.к. ранее были примеры с .reduce - с 2мя параметрами, а тут 3 и немного взрывается мозг что как и откуда, как куда применяется, особенно синтаксис:

`${result}${str}${values[i] || ''}`, ''
Это как расшифровывать, почему так? хоть бы расшифровку кинули этой строки =((( Вот вам пример использования - а как что к чему в нем - ковыряйтесь сами...
Анастасия Уровень 27
15 августа 2025
Методом дебага разобралась почему так и как оно работает и зачем там 3(а не 2 переменные, как в обычных массивах), расмотрим пример, который был выше в комментарии:

function highlight(strings, ...values) {
  return strings.reduce((result, str, i) => {
    const value = values[i] !== undefined ? `<span class="highlight">${values[i]}</span>` : '';
    return `${result}${str}${value}`;
  }, '');
}
1. result - это итоговая переменная(аккомулирующая), которая будет возвращена 2. str - считает текст, который у нас прям тект написан, там получается 3 элемента: - "My name is " - " and I love " - "." 3. i - это индекс, ну или номер итерации цикла, в котором крутится наша функция result. Она нам нужна, чтобы обращаться к значениям переменных(которые мы прописывали по правилу "${name}") про правилу - values[i] и мы это складываем в значение value. Итак, осталась последняя строка: `${result}${str}${value}`. В ней мы получается возвращаем последовательность (которая в дальнейшем сохранится в значении result для следующей итерации или при выходе из данной функции) Тут мы просто последовательно складываем в строку занчения этих переменных. Зачем нужна проверка на undefined? - всё просто, у нас последний элемент - ".", у которого нет значения в массиве values (т.к. там 2 значения, а строчек 3), поэтому values[i] - вернет значение undefined и в итоге получится:

My name is '<span>'Carol'</span>' and I love '<span>'painting'</span>'.'<span>''</span>'
Анастасия Уровень 27
15 августа 2025
Попробовала данную функцию с такой строкой

let test = 'test'
const message = highlight`My name is ${name} and I love ${hobby}${test}`;
Получилось, что последняя итерация (это 3я итерация с номером 2) - имеет значение в values[i], но при этом значение str = "", на сколько я поняла. Так что не бойтесь, когда у вас пременных больше чем текста в нем. Главное в конце не забываем прописывать , '' перед закрывающейся скобкой функции reduce, иначе будет криво обрабатываться (первое значение result будет не пустая строка, а "My name is " и он пропустит первое value, при этом итерация будет начинаться не с 0, а с 1. Это можно пропустить, т.к. оно прописывается в конце и я не сразу поняла почему проблема в задании из урока. Если что, это мы так задаём начальное аккомулирующее значение. Жаль что большие текста в комметарии не вставить, пришлось разбивать, простите =(