Avatar ·

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

Всем привет! Я новичок в JavaScript и столкнулся с проблемой. Мне нужно сохранить в переменную длинный текст, который занимает несколько строк. Например, я хочу сделать что-то вроде этого: ```javascript let myString = "Это первая строка Это вторая строка И третья строка"; ``` Но когда я пишу такой код, JavaScript выдает ошибку: "Uncaught SyntaxError: unterminated string literal". Я понимаю, что кавычки должны быть закрыты на той же строке, но как тогда быть с многострочным текстом? Я пытался использовать обратный слеш в конце каждой строки: ```javascript let myString = "Это первая строка \ Это вторая строка \ И третья строка"; ``` Это вроде работает, но текст выводится в одну строку, а не в три. Мне нужно, чтобы строки сохранялись именно как отдельные строчки с переносами. Еще я слышал про шаблонные литералы (template literals) с обратными кавычками, но не совсем понимаю, как их использовать для этой задачи. Подскажите, пожалуйста, как правильно объявить многострочную строку в JavaScript? Есть ли несколько способов? И какой из них считается лучшей практикой в современном JS? Заранее спасибо за помощь! <<>>

Решение: используйте шаблонные литералы (template literals)

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

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

let myString = `Это первая строка
Это вторая строка
И третья строка`;

console.log(myString);
// Вывод:
// Это первая строка
// Это вторая строка
// И третья строка

Как видите, всё просто: вы просто пишете текст между обратными кавычками, и все переносы строк сохраняются в переменной.

Дополнительные возможности шаблонных литералов

Шаблонные литералы дают не только многострочность, но и другие полезные функции:

  • Интерполяция выражений — можно вставлять переменные и выражения прямо в строку с помощью синтаксиса ${...}:
let name = "Иван";
let age = 30;
let greeting = `Привет, меня зовут ${name} и мне ${age} лет.`;
console.log(greeting); // "Привет, меня зовут Иван и мне 30 лет."
  • Сохранение пробелов и табуляции — все отступы внутри обратных кавычек тоже сохраняются:
let codeBlock = `function hello() {
    console.log("Привет, мир!");
}`;
console.log(codeBlock);
// Вывод:
// function hello() {
//     console.log("Привет, мир!");
// }

Альтернативные подходы (для старых браузеров или специфических случаев)

Если вам нужно поддерживать очень старые браузеры (IE11 и ниже), или вы работаете с кодом, где нельзя использовать ES6, можно применить другие методы:

1. Конкатенация строк с символом новой строки

let myString = "Это первая строка\n" +
               "Это вторая строка\n" +
               "И третья строка";
console.log(myString);
// Вывод:
// Это первая строка
// Это вторая строка
// И третья строка

Здесь \n — это escape-последовательность, обозначающая символ новой строки.

2. Массив и метод join()

let myString = [
  "Это первая строка",
  "Это вторая строка",
  "И третья строка"
].join("\n");
console.log(myString);
// Вывод:
// Это первая строка
// Это вторая строка
// И третья строка

Лучшая практика

В современном JavaScript (ES6+) всегда используйте шаблонные литералы для многострочных строк. Они читаются легче, поддерживают интерполяцию и являются стандартом. Исключение — если вам нужно поддерживать древние браузеры (IE11 и ниже), тогда используйте конкатенацию с \n.

И помните: обратный слеш в конце строки (\) — это не решение вашей задачи. Он просто позволяет продолжить строку на следующей строке в коде, но не добавляет реальный перенос строки в переменную.

<<>>

Дополнение: работа с пробелами и отступами

Когда вы используете шаблонные литералы внутри функций или классов, часто возникает проблема с лишними пробелами в начале строк из-за отступов кода. Вот как это решается:

function getMessage() {
    return `Это первая строка
Это вторая строка
И третья строка`; // Проблема: отступы не сохраняются
}

// Решение: используйте trim() или выравнивайте текст
function getMessageClean() {
    return `Это первая строка
Это вторая строка
И третья строка`.trim();
}

Если вам нужно сохранить отступы, но они мешают читаемости кода, можно использовать следующий трюк с массивом:

function getIndentedMessage() {
    return [
        "    Это первая строка",
        "    Это вторая строка",
        "    И третья строка"
    ].join("\n");
}

Также помните, что в некоторых редакторах кода (например, VS Code) можно настроить автоматическое удаление лишних пробелов при форматировании, что может повлиять на ваши многострочные строки. Будьте внимательны!