Перейти к содержимому
Теория · Строки · урок 1 из 12

Строки

Чему вы научитесь

Чему вы научитесь:

  • доставать символ строки по индексу и узнавать её длину;
  • собирать строку из текста и значений с помощью шаблонной строки;
  • вырезать, искать и переделывать части строки методами;
  • объяснять, почему "10" < "9", и сравнивать слова по алфавиту.
Табличка cat из трёх клеточек с номерами 0 1 2, за ней пустая пунктирная клеточка, первая с биркой word[0]

Представьте табличку с надписью, где каждая буква напечатана в своей клеточке. Клеточки пронумерованы слева направо, и счёт начинается с нуля. Так JavaScript и хранит текст.

Строка — это последовательность символов, и у каждого символа есть номер. По номеру символ можно достать, а длину строки JavaScript знает сам. Давайте посмотрим на слово "cat":

JavaScript
const word = "cat";

console.log(word.length); // 3
console.log(word[0], word[2]); // c t
console.log(word[3]); // undefined
console.log(word[word.length - 1]); // t
console.log(word[0] + word[1]); // ca

Разберём вывод по строкам:

  1. word.length — длина строки: в "cat" три символа.
  2. word[0] и word[2] — первая и последняя клеточки, c и t.
  3. word[3] — клеточки с номером 3 нет, и выражение даёт undefined.
  4. word[word.length - 1] — снова последний символ: его номер на единицу меньше длины.
  5. word[0] + word[1] склеивает два символа в строку ca.

Длина и индексы

Свойство — значение, которое читают через точку после имени. Вы уже встречали такое: Math.PI. У каждой строки есть свойство length: число символов в ней. У пустой строки "" длина 0.

Номер символа называют индексом, как номер элемента массива. Индексы считают с 0, поэтому последний символ — word[word.length - 1].

Что ещё важно знать об индексах:

  • символ, полученный по индексу, тоже строка длиной 1;
  • индекс за концом строки ошибки не вызывает: выражение word[3] даёт undefined;
  • в строке длиной n индексы идут от 0 до n - 1.

Поэтому цикл перебирает символы по очереди: счётчик i идёт от 0, пока i < word.length. Тот же порядок даёт и for…of по строке.

Буква латиницы или кириллицы, цифра и пробел считаются за один символ: "кот".length тоже 3. Большинство эмодзи считается за два символа и больше. Поэтому длина строки с эмодзи бывает больше, чем видно глазом.

Строку нельзя изменить

Вернёмся к табличке. Надпись на ней напечатана: стереть одну букву и вписать другую нельзя. Зато можно напечатать новую табличку и повесить её вместо старой.

Со строками так же. Строки неизменяемые: символы созданной строки не меняются никогда. Присваивание по индексу ничего не делает. Изменить можно переменную: положить в неё новую строку. Оператор + тоже не трогает свои строки, а создаёт из них третью.

У строк есть методы — функции, которые вызывают через точку у значения: pet.toUpperCase(). Метод строки не меняет её, а возвращает новую строку. Давайте проверим всё это на примере:

JavaScript
let pet = "cat";
pet[0] = "b";
console.log(pet); // cat
const loud = pet.toUpperCase();
console.log(loud, pet); // CAT cat
pet = "b" + pet[1] + pet[2];
console.log(pet); // bat
  1. let pet = "cat" кладёт в переменную строку "cat".
  2. pet[0] = "b" пытается заменить первую букву, но строка не меняется, и программа печатает cat.
  3. pet.toUpperCase() возвращает новую строку "CAT", и её сохраняет loud. Сама pet по-прежнему cat.
  4. pet = "b" + pet[1] + pet[2] собирает новую строку "bat" и кладёт её в переменную. Это и есть новая табличка вместо старой.

Здесь аналогия заканчивается: старую табличку не нужно снимать и выбрасывать. Когда строка больше никому не нужна, JavaScript сам освобождает занятую ею память.

Присваивание pet[0] = "b" молча пропускается только в обычном скрипте. В строгом режиме, с "use strict" в начале файла, то же присваивание останавливает программу. Это текст Node.js и Chrome:

TEXT
TypeError: Cannot assign to read only property '0' of string 'cat'

Этот вопрос часто задают на собеседовании: «Можно ли изменить символ строки?» Ответ состоит из двух частей:

  • нет, строки неизменяемые, а методы и + создают новую строку;
  • запись по индексу молча пропускается, а в строгом режиме останавливает программу с TypeError.

Частая ошибка

Метод вызвали, а его результат никуда не положили:

JavaScript
const user = "ann";
user.toUpperCase(); // ✗
console.log(user); // ann

Ошибки нет, но строка user осталась прежней. Метод вернул новую строку "ANN", и она пропала, потому что её не сохранили. Сохраните результат в переменную: const upper = user.toUpperCase(); — тогда upper равна "ANN".

Главное

  • Строка — последовательность символов с индексами от 0 до length - 1.
  • s[i] даёт символ — строку длиной 1, а индекс за концом строки даёт undefined.
  • Строки неизменяемые: методы и + возвращают новую строку, а не меняют старую.
  • Результат метода сохраняют в переменную, иначе он пропадёт.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом