Learning Book

Строки и Unicode

Строки и Unicode

Создание строк

// Три способа — функционально одинаковы для простых случаев
const single = 'одинарные кавычки';
const double = "двойные кавычки";
const template = `шаблонный литерал`;

// Типичное соглашение: одинарные для обычных строк,
// шаблонные — когда нужна интерполяция или многострочность

Неизменяемость

const name = 'JavaScript';

// Нельзя изменить символ по индексу
name[0] = 'j'; // игнорируется (TypeError в strict mode)
console.log(name); // 'JavaScript'

// Все методы возвращают новую строку
const lower = name.toLowerCase(); // 'javascript'
console.log(name); // 'JavaScript' — исходная не изменилась

Длина и доступ к символам

const str = 'Привет';

str.length;   // 6 — количество символов

// Доступ по индексу (только чтение)
str[0];       // 'П'
str.at(0);    // 'П' — метод at()
str.at(-1);   // 'т' — отрицательные индексы (новый синтаксис)
str.charAt(2); // 'и' — устаревший способ

// Итерация
for (const char of str) {
  console.log(char); // П, р, и, в, е, т
}

Экранирование

const str1 = 'It\'s a test';   // экранирование одинарной кавычки
const str2 = "Say \"hello\"";  // экранирование двойной кавычки
const str3 = 'line1\nline2';   // перенос строки
const str4 = 'tab\there';      // табуляция
const str5 = 'back\\slash';    // обратный слеш
const unicode = '\u0041';      // 'A' — Unicode escape

Конкатенация

const first = 'Иван';
const last = 'Петров';

// Оператор + (классический)
const full1 = first + ' ' + last; // 'Иван Петров'

// Шаблонный литерал (предпочтительно)
const full2 = `${first} ${last}`; // 'Иван Петров'

// Метод concat (устарел, не рекомендуется)
const full3 = first.concat(' ', last);
Не используйте + для конкатенации в циклах — создаёт много временных строк. Для накопления используйте массив и join('').

JavaScript хранит строки в UTF-16. Большинство символов занимают одну «кодовую единицу» (2 байта). Но символы вне BMP (Basic Multilingual Plane) — некоторые эмодзи, редкие иероглифы — занимают две: это суррогатные пары.

const emoji = '😀';
emoji.length;    // 2 — не 1! Два суррогата
emoji[0];        // '?' — половина суррогатной пары, не символ
[...emoji];      // ['😀'] — spread корректно обрабатывает суррогаты
[...emoji].length; // 1 — правильный подсчёт

Методы for…of и spread используют Unicode code points и корректно работают с суррогатными парами.