Шаблонные строки
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Обратные кавычки — третий вид кавычек в JavaScript и единственный, внутри которого продолжает работать код: ${...} вычисляет выражение и вставляет результат прямо в текст. Плюс переносы строк без \n.
В JavaScript три вида кавычек. Двойные и одинарные — близнецы: обе делают обычную строку, и разница между ними только в том, какую кавычку внутри не придётся экранировать. Третья, обратная кавычка `, — другой зверь. Строка в обратных кавычках называется шаблонной и умеет два трюка: подставлять значения в текст и переносить строки без спецсимволов.
Самое заметное отличие видно сразу: внутри шаблонной строки конструкция ${...} вычисляется, а в обычной остаётся просто набором символов.
| Кавычки | Подстановка ${...} | Перенос строки внутри |
|---|---|---|
| Двойные и одинарные | нет, остаётся текстом | нет, нужен \n |
| Обратные (шаблонные) | да, вычисляется | да, просто перенос |
Обратная кавычка живёт слева от единицы — там же, где на русской раскладке «ё». В русской раскладке она не набирается, нужно переключиться на английскую. Клавишу стоит запомнить: шаблонные строки встречаются едва ли не в каждом файле.
Внутри ${...} движок вычисляет то, что вы написали, приводит результат к строке и вставляет на это место. Всё остальное в шаблоне остаётся текстом как есть — включая пробелы и знаки препинания.
Сравните со склейкой плюсами. Результат тот же, но в склейке пробелы приходится держать в голове: потерял один — и слова слиплись.
Приведение к строке происходит автоматически — и не всегда так, как хочется. Массив склеится через запятую, а обычный объект превратится в [object Object]. Это не ошибка шаблона, это общее правило приведения типов, просто здесь оно особенно заметно.
В фигурных скобках живёт не «имя переменной», а выражение — всё, что имеет значение: арифметика, обращение к свойству, вызов функции, тернарный оператор, ещё одна шаблонная строка.
А вот инструкции — if, for, объявление переменной — туда не поместятся: у них нет значения, которое можно вставить в текст. Условие в шаблоне пишут тернарным оператором, как выше. И помните: подстановка вычисляется в момент создания строки, а не тогда, когда строку выведут.
В обычной строке перенос приходится изображать спецсимволом \n, а длинный текст — собирать из кусков. В шаблонной строке перенос пишется переносом: нажали Enter — он попал в текст. Получается ровно та же строка, просто записанная по-человечески.
Шаблон сохраняет всё, что стоит между кавычками, — в том числе пробелы, которыми вы красиво выровняли код внутри функции. Строка получится с лишними отступами, и в вёрстке или в письме это будет видно.
Раз внутри ${...} допустимо любое выражение, туда можно положить ещё одну шаблонную строку. Кавычки считаются парами, поэтому вложение читается однозначно — хотя глазами первые пару раз непривычно.
Два уровня — нормально, три — уже ребус. Если внутри подстановки начинается логика, вынесите её в переменную или отдельную функцию: шаблон должен оставаться похожим на текст, иначе он теряет единственное своё преимущество перед склейкой.
Если поставить имя функции вплотную перед обратной кавычкой, шаблон не превратится в строку сам. Вместо этого вызовется функция и получит текст уже разобранным: первым аргументом — массив статических кусков, дальше — значения подстановок. Что вернуть, решает функция: строку, число, что угодно.
Кусков всегда на один больше, чем подстановок, — крайние могут быть пустыми. На тегах строят экранирование HTML, локализацию, подсветку SQL. В повседневном коде вы будете их скорее читать, чем писать, но один встроенный тег пригодится сразу.
Обычный шаблон обрабатывает escape-последовательности: \n становится переносом строки, \t — табуляцией. Тег String.raw отдаёт текст без этой обработки — удобно для путей Windows и регулярных выражений.
- Обратные кавычки создают шаблонную строку: она подставляет значения и хранит переносы строк.
- Внутри ${...} допустимо любое выражение — арифметика, вызов, тернарник; инструкции вроде if — нет.
- Результат подстановки приводится к строке автоматически: массив станет списком через запятую, объект — [object Object].
- Перенос строки пишется переносом, но вместе с ним в строку попадают и отступы, которыми выровнен код.
- Имя функции перед кавычкой превращает шаблон в тегированный: функция получает куски текста и значения по отдельности.
1/3Что выведет console.log("Сумма: ${2 + 2}") — с обычными двойными кавычками?
2/3Какое выражение нельзя написать внутри ${...}?
3/3Тег вызван так: tag`${1}${2}`. Сколько элементов будет в первом аргументе — массиве статических кусков?
Собрать фразу шаблоном
Перепишите вывод так, чтобы вместо склейки плюсами была одна шаблонная строка. Результат должен остаться прежним — вплоть до пробелов и точки.
Все плюсы и краевые пробелы исчезают, текст пишется как текст:
Обратите внимание на пробелы: в шаблоне они стоят там же, где в готовой фразе, и видны глазами. В склейке их легко потерять — и получить «Меня зовутИгорь».
Ценник с условием
Напишите функцию card(title, price), которая возвращает строку вида «Чай — 250 руб.», а при нулевой цене — «Вода — бесплатно». Условие поместите прямо в подстановку, без if.
Внутри подстановки — тернарный оператор, а в его ветке — ещё один шаблон:
Ноль здесь работает как ложное значение, поэтому проверки price ? достаточно. Если же ценой может быть null или undefined, а ноль надо показывать как «0 руб.», условие пишут явно: price > 0.