Шаблонные строки

типы≈ 6 минут

Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.

Обратные кавычки — третий вид кавычек в JavaScript и единственный, внутри которого продолжает работать код: ${...} вычисляет выражение и вставляет результат прямо в текст. Плюс переносы строк без \n.

Разделы темы:·

В JavaScript три вида кавычек. Двойные и одинарные — близнецы: обе делают обычную строку, и разница между ними только в том, какую кавычку внутри не придётся экранировать. Третья, обратная кавычка `, — другой зверь. Строка в обратных кавычках называется шаблонной и умеет два трюка: подставлять значения в текст и переносить строки без спецсимволов.

Самое заметное отличие видно сразу: внутри шаблонной строки конструкция ${...} вычисляется, а в обычной остаётся просто набором символов.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.
КавычкиПодстановка ${...}Перенос строки внутри
Двойные и одинарныенет, остаётся текстомнет, нужен \n
Обратные (шаблонные)да, вычисляетсяда, просто перенос

Обратная кавычка живёт слева от единицы — там же, где на русской раскладке «ё». В русской раскладке она не набирается, нужно переключиться на английскую. Клавишу стоит запомнить: шаблонные строки встречаются едва ли не в каждом файле.

Внутри ${...} движок вычисляет то, что вы написали, приводит результат к строке и вставляет на это место. Всё остальное в шаблоне остаётся текстом как есть — включая пробелы и знаки препинания.

Сравните со склейкой плюсами. Результат тот же, но в склейке пробелы приходится держать в голове: потерял один — и слова слиплись.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Приведение к строке происходит автоматически — и не всегда так, как хочется. Массив склеится через запятую, а обычный объект превратится в [object Object]. Это не ошибка шаблона, это общее правило приведения типов, просто здесь оно особенно заметно.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

В фигурных скобках живёт не «имя переменной», а выражение — всё, что имеет значение: арифметика, обращение к свойству, вызов функции, тернарный оператор, ещё одна шаблонная строка.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

А вот инструкции — if, for, объявление переменной — туда не поместятся: у них нет значения, которое можно вставить в текст. Условие в шаблоне пишут тернарным оператором, как выше. И помните: подстановка вычисляется в момент создания строки, а не тогда, когда строку выведут.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

В обычной строке перенос приходится изображать спецсимволом \n, а длинный текст — собирать из кусков. В шаблонной строке перенос пишется переносом: нажали Enter — он попал в текст. Получается ровно та же строка, просто записанная по-человечески.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Шаблон сохраняет всё, что стоит между кавычками, — в том числе пробелы, которыми вы красиво выровняли код внутри функции. Строка получится с лишними отступами, и в вёрстке или в письме это будет видно.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Раз внутри ${...} допустимо любое выражение, туда можно положить ещё одну шаблонную строку. Кавычки считаются парами, поэтому вложение читается однозначно — хотя глазами первые пару раз непривычно.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.
js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Два уровня — нормально, три — уже ребус. Если внутри подстановки начинается логика, вынесите её в переменную или отдельную функцию: шаблон должен оставаться похожим на текст, иначе он теряет единственное своё преимущество перед склейкой.

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

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Кусков всегда на один больше, чем подстановок, — крайние могут быть пустыми. На тегах строят экранирование HTML, локализацию, подсветку SQL. В повседневном коде вы будете их скорее читать, чем писать, но один встроенный тег пригодится сразу.

Обычный шаблон обрабатывает escape-последовательности: \n становится переносом строки, \t — табуляцией. Тег String.raw отдаёт текст без этой обработки — удобно для путей Windows и регулярных выражений.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

  • Обратные кавычки создают шаблонную строку: она подставляет значения и хранит переносы строк.
  • Внутри ${...} допустимо любое выражение — арифметика, вызов, тернарник; инструкции вроде if — нет.
  • Результат подстановки приводится к строке автоматически: массив станет списком через запятую, объект — [object Object].
  • Перенос строки пишется переносом, но вместе с ним в строку попадают и отступы, которыми выровнен код.
  • Имя функции перед кавычкой превращает шаблон в тегированный: функция получает куски текста и значения по отдельности.

1/3Что выведет console.log("Сумма: ${2 + 2}") — с обычными двойными кавычками?

2/3Какое выражение нельзя написать внутри ${...}?

3/3Тег вызван так: tag`${1}${2}`. Сколько элементов будет в первом аргументе — массиве статических кусков?

Собрать фразу шаблоном

Перепишите вывод так, чтобы вместо склейки плюсами была одна шаблонная строка. Результат должен остаться прежним — вплоть до пробелов и точки.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Все плюсы и краевые пробелы исчезают, текст пишется как текст:

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Обратите внимание на пробелы: в шаблоне они стоят там же, где в готовой фразе, и видны глазами. В склейке их легко потерять — и получить «Меня зовутИгорь».

Ценник с условием

Напишите функцию card(title, price), которая возвращает строку вида «Чай — 250 руб.», а при нулевой цене — «Вода — бесплатно». Условие поместите прямо в подстановку, без if.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Внутри подстановки — тернарный оператор, а в его ветке — ещё один шаблон:

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Ноль здесь работает как ложное значение, поэтому проверки price ? достаточно. Если же ценой может быть null или undefined, а ноль надо показывать как «0 руб.», условие пишут явно: price > 0.