В JavaScript любые текстовые данные являются строками. Не существует отдельного типа «символ», который есть в ряде других языков.
Внутренний формат для строк — всегда UTF-16, вне зависимости от кодировки страницы.
Кавычки
В JavaScript есть разные типы кавычек.
Строку можно создать с помощью одинарных, двойных либо обратных кавычек:
let single = 'single-quoted';
let double = "double-quoted";
let backticks = `backticks`;
Одинарные и двойные кавычки работают, по сути, одинаково, а если использовать обратные кавычки, то в такую строку мы сможем вставлять произвольные выражения, обернув их в ${…}
:
function sum(a, b) {
return a + b;
}
alert(`1 + 2 = ${sum(1, 2)}.`); // 1 + 2 = 3.
Ещё одно преимущество обратных кавычек — они могут занимать более одной строки, вот так:
let guestList = `Guests:
* John
* Pete
* Mary
`;
alert(guestList); // список гостей, состоящий из нескольких строк
Выглядит вполне естественно, не правда ли? Что тут такого? Но если попытаться использовать точно так же одинарные или двойные кавычки, то будет ошибка:
let guestList = "Guests: // Error: Unexpected token ILLEGAL
* John";
Одинарные и двойные кавычки в языке с незапамятных времён: тогда потребность в многострочных строках не учитывалась. Что касается обратных кавычек, они появились существенно позже, и поэтому они гибче.
Обратные кавычки также позволяют задавать «шаблонную функцию» перед первой обратной кавычкой. Используемый синтаксис: func`string`
. Автоматически вызываемая функция func
получает строку и встроенные в неё выражения и может их обработать. Подробнее об этом можно прочитать в документации. Если перед строкой есть выражение, то шаблонная строка называется «теговым шаблоном». Это позволяет использовать свою шаблонизацию для строк, но на практике теговые шаблоны применяются редко.
Спецсимволы
Многострочные строки также можно создавать с помощью одинарных и двойных кавычек, используя так называемый «символ перевода строки», который записывается как \n
:
let guestList = "Guests:\n * John\n * Pete\n * Mary";
alert(guestList); // список гостей, состоящий из нескольких строк
В частности, эти две строки эквивалентны, просто записаны по-разному:
// перевод строки добавлен с помощью символа перевода строки
let str1 = "Hello\nWorld";
// многострочная строка, созданная с использованием обратных кавычек
let str2 = `Hello
World`;
alert(str1 == str2); // true
Есть и другие, реже используемые спецсимволы. Вот список:
Символ | Описание |
---|---|
\n | Перевод строки |
\r | Возврат каретки: самостоятельно не используется. В текстовых файлах Windows для перевода строки используется комбинация символов \r\n . |
\' , \" | Кавычки |
\\ | Обратный слеш |
\t | Знак табуляции |
\b , \f , \v | Backspace, Form Feed и Vertical Tab — оставлены для обратной совместимости, сейчас не используются. |
\xXX | Символ с шестнадцатеричным юникодным кодом XX , например, '\x7A' — то же самое, что 'z' . |
\uXXXX | Символ в кодировке UTF-16 с шестнадцатеричным кодом XXXX , например, \u00A9 — юникодное представление знака копирайта, © . Код должен состоять ровно из 4 шестнадцатеричных цифр. |
\u{X…XXXXXX} (от 1 до 6 шестнадцатеричных цифр) | Символ в кодировке UTF-32 с шестнадцатеричным кодом от U+0000 до U+10FFFF. Некоторые редкие символы кодируются двумя 16-битными словами и занимают 4 байта. Так можно вставлять символы с длинным кодом. |
Примеры с Юникодом:
// ©
alert( "\u00A9" );
// Длинные юникодные коды
// 佫, редкий китайский иероглиф
alert( "\u{20331}" );
// 😍, лицо с улыбкой и глазами в форме сердец
alert( "\u{1F60D}" );
Все спецсимволы начинаются с обратного слеша, \
— так называемого «символа экранирования».
Он также используется, если необходимо вставить в строку кавычку.
К примеру:
alert( 'I\'m the Walrus!' ); // I'm the Walrus!
Здесь перед входящей в строку кавычкой необходимо добавить обратный слеш — \'
— иначе она бы обозначала окончание строки.
Разумеется, требование экранировать относится только к таким же кавычкам, как те, в которые заключена строка. Так что мы можем применить и более элегантное решение, использовав для этой строки двойные или обратные кавычки:
alert( `I'm the Walrus!` ); // I'm the Walrus!
Заметим, что обратный слеш \
служит лишь для корректного прочтения строки интерпретатором, но он не записывается в строку после её прочтения. Когда строка сохраняется в оперативную память, в неё не добавляется символ \
. Вы можете явно видеть это в выводах alert
в примерах выше.
Но что, если нам надо добавить в строку собственно сам обратный слеш \
?
Это можно сделать, добавив перед ним… ещё один обратный слеш!
alert( `The backslash: \\` ); // The backslash: \