JavaScript: Экранирующие последовательности
Допустим, мы хотим вывести текст ниже в две строчки.
- Are you hungry?
- Aaaarrrgh!Если мы просто передадим этот текст в console.log(), то JavaScript напечатает всё в одну строчку. Технически можно написать два подряд идущих console.log(), но представим, что мы хотим это сделать с помощью одного.
console.log('- Are you hungry?- Aaaarrrgh!');
// => - Are you hungry?- Aaaarrrgh!Чтобы каждая из них начиналась с новой строки, нужно добавить перевод строки, то есть «нажать Enter». В программировании это реализуется через добавление специальных символов, в данном случае \n. Да, это не опечатка. Несмотря на то, что мы видим здесь два символа, с точки зрения JavaScript это один символ.
console.log('- Are you hungry?\n- Aaaarrrgh!');Результат будет таким.
- Are you hungry?
- Aaaarrrgh!Что такое \n?
\n является управляющей последовательностью (англ. escape sequence, иногда говорят «экранированная последовательность»). Она обозначает перевод строки, но не отображается напрямую. Вы не увидите \n в выводе программы, так как она влияет только на расположение текста.
В текстовых редакторах при нажатии Enter добавляется невидимый символ LF (Line Feed). Именно его и означает \n. Иногда такие символы можно увидеть, если включить отображение спецсимволов.
- Привет!¶
- О, привет!¶
- Как дела?Принтеры, редакторы и интерпретаторы JavaScript понимают \n как команду начать строку с новой строки.
Примеры использования \n
Вот как JavaScript обрабатывает управляющую последовательность \n.
В коде 'Hello\nWorld'
↓
На экране Hello
WorldМестоположение \n меняет итоговый вывод.
console.log('Hello\nWorld');
// Hello
// World
console.log('Hello \nWorld');
// Hello
// World (в конце первой строки есть пробел)
console.log('Hello\n World');
// Hello
// World (во второй строке в начале пробел)
console.log('Hello\n\nWorld');
// Hello
//
// World (пустая строка между ними)Пробелы до или после \n также учитываются. JavaScript воспринимает их как обычные символы и отображает в выводе.
Вы также можете вставлять \n в любую часть строки, до, после или даже использовать его отдельно.
console.log('First line');
console.log('\n'); // просто пустая строка
console.log('Second line');Результат будет таким.
First line
Second lineКак вывести сам символ \n
\n в JavaScript является управляющей последовательностью. Она управляет расположением текста и не выводится на экран как обычные символы. Если вам нужно вывести именно символы \ и n, а не перевод строки, их нужно экранировать. Для этого перед обратным слешем добавляют ещё один слеш.
console.log('Hello\\nWorld');
// Hello\nWorld
// Если забыть указать второй слеш
console.log('Hello\nWorld');
// Hello
// WorldВ этом случае JavaScript понимает \\ как обычный обратный слеш и показывает строку без перевода строки.
Другие управляющие последовательности
Кроме \n, в JavaScript есть и другие управляющие последовательности.
\tобозначает табуляцию (эквивалент клавиши Tab).\rобозначает возврат каретки (используется в Windows, но редко применяется в современном коде).- В программировании чаще всего используют именно
\n, его достаточно для большинства задач.
Важные детали
\nявляется одним символом, несмотря на то, что в коде он записан как два (\иn).- На Windows по умолчанию используется комбинация
\r\n, но в JavaScript (и вообще в кроссплатформенной разработке) принято использовать только\n, чтобы избежать проблем при переносе кода между системами.
Задание
Вы пишете программу, которая показывает пользователю подсказку о том, как разбить текст на строки. Выведите подсказку одним вызовом console.log():
Use "\n" to separate lines
Example: console.log("line1\nline2")Обратите внимание: \n в первой строке — это буквальный текст, а не перевод строки.
Полезное
Ваше упражнение проверяется по этим тестам
// @ts-check
import { expect, test, vi } from 'vitest';
test('escape characters', async () => {
const consoleLogSpy = vi.spyOn(console, 'log');
await import('./index.js');
const firstArg = consoleLogSpy.mock.calls.join('\n');
expect(firstArg).toBe(
'Use "\\n" to separate lines\nExample: console.log("line1\\nline2")',
);
});Решение учителя откроется через:
20:00
