Avatar ·

Как присвоить многострочную строку переменной в JavaScript?

Всем привет! Я только начал изучать JavaScript и столкнулся с проблемой, которая кажется мне очень простой, но я не могу найти элегантного решения. Мне нужно сохранить в переменную длинный текст, который занимает несколько строк. Например, я хочу записать многострочное приветствие или шаблон HTML-кода. Когда я пытаюсь сделать это обычным способом, используя одинарные или двойные кавычки, у меня всё ломается. Вот как я пытаюсь сделать: ```javascript var message = 'Привет, мир! Это вторая строка. А это третья строка.'; ``` Но JavaScript выдаёт ошибку, потому что строка не может быть разорвана переносом строки внутри одинарных кавычек. Я пробовал использовать обратный слеш `\` в конце каждой строки, но это выглядит очень некрасиво и неудобно, особенно если строк много. Я слышал, что в некоторых языках есть "heredoc" синтаксис, но в JavaScript я такого не нашёл. Может быть, есть какой-то специальный способ объединить строки или использовать другой тип кавычек? Как правильно записать многострочную строковую переменную, чтобы код оставался читаемым? Буду благодарен за подробное объяснение с примерами. Заранее спасибо! <<>>

Использование шаблонных строк (Template Literals) — современный и правильный способ

В современном JavaScript (начиная с ES6 / ECMAScript 2015) лучший способ создать многострочную строку — это использовать шаблонные строки (template literals). Они используют обратные кавычки (backticks) ` вместо одинарных или двойных кавычек и позволяют естественным образом переносить текст на новые строки.

Вот как будет выглядеть ваш пример:

const message = `Привет, мир!
Это вторая строка.
А это третья строка.`;

console.log(message);
// Вывод:
// Привет, мир!
// Это вторая строка.
// А это третья строка.

Шаблонные строки сохраняют все пробелы и переносы строк внутри обратных кавычек. Это очень удобно для:

  • HTML-шаблонов — вставка больших кусков разметки прямо в код.
  • SQL-запросов — форматирование запросов для читаемости.
  • Текстовых сообщений — письма, уведомления.

Интерполяция выражений (вставка переменных)

Главное преимущество шаблонных строк — возможность вставлять значения переменных и выражения прямо в строку с помощью синтаксиса ${...}:

const name = "Алексей";
const age = 30;

const greeting = `Привет, ${name}!
Тебе уже ${age} лет.
Через год будет ${age + 1}.`;

console.log(greeting);
// Вывод:
// Привет, Алексей!
// Тебе уже 30 лет.
// Через год будет 31.

Это гораздо удобнее, чем конкатенация строк через +.

Старый способ (для обратной совместимости)

Если вы работаете с очень старым кодом (до ES6) или не можете использовать шаблонные строки по каким-то причинам, можно использовать конкатенацию строк с явным указанием символа новой строки \n:

var message = 'Привет, мир!\n' +
              'Это вторая строка.\n' +
              'А это третья строка.';

Или с помощью массива и метода join():

var message = [
  'Привет, мир!',
  'Это вторая строка.',
  'А это третья строка.'
].join('\n');

Важные моменты

  • Отступы сохраняются: если вы используете отступы внутри шаблонной строки, они тоже попадут в итоговую строку. Иногда это нежелательно, и нужно обрезать лишние пробелы.
  • Экранирование: если вам нужен символ обратной кавычки внутри шаблонной строки, экранируйте его: \`.
  • Производительность: шаблонные строки работают так же быстро, как и обычная конкатенация, и код становится чище.

Рекомендую всегда использовать шаблонные строки для многострочного текста в современном JavaScript. Это стандарт де-факто и самый читаемый способ.

<<>>

Альтернативный подход: экранирование переносов строк и функция-хелпер

Иногда бывает нужно сохранить многострочную строку, но при этом не хочется, чтобы в ней были лишние пробелы или символы переноса. Например, если вы формируете SQL-запрос или JSON и хотите видеть аккуратный код, но итоговая строка должна быть однострочной.

В таких случаях можно использовать экранирование переноса строки внутри шаблонной строки с помощью обратного слеша \ в конце строки:

const longQuery = `SELECT * FROM users \
WHERE age > 18 \
ORDER BY name;`;

console.log(longQuery);
// Вывод: SELECT * FROM users WHERE age > 18 ORDER BY name;

Этот трюк делает код читаемым, но итоговая строка не содержит символов новой строки. Однако будьте осторожны: после обратного слеша не должно быть никаких пробелов или других символов, иначе экранирование не сработает.

Ещё один вариант для очень старых браузеров (Internet Explorer) — использовать комментарии и join, хотя это уже архаизм:

var multiline = [
  "Первая строка",
  "Вторая строка",
  "Третья строка"
].join("\n");

Но в 2023 году это уже неактуально — шаблонные строки поддерживаются всеми современными средами (Node.js, Chrome, Firefox, Safari, Edge).