Строки
Чему вы научитесь:
- доставать символ строки по индексу и узнавать её длину;
- собирать строку из текста и значений с помощью шаблонной строки;
- вырезать, искать и переделывать части строки методами;
- объяснять, почему
"10" < "9", и сравнивать слова по алфавиту.
![Табличка cat из трёх клеточек с номерами 0 1 2, за ней пустая пунктирная клеточка, первая с биркой word[0]](/course-covers/javascript-beginners/07-strings.webp)
Представьте табличку с надписью, где каждая буква напечатана в своей клеточке. Клеточки пронумерованы слева направо, и счёт начинается с нуля. Так JavaScript и хранит текст.
Строка — это последовательность символов, и у каждого символа есть номер. По номеру символ можно достать, а длину строки JavaScript знает сам. Давайте посмотрим на слово "cat":
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Разберём вывод по строкам:
word.length— длина строки: в"cat"три символа.word[0]иword[2]— первая и последняя клеточки,cиt.word[3]— клеточки с номером3нет, и выражение даётundefined.word[word.length - 1]— снова последний символ: его номер на единицу меньше длины.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(). Метод строки не меняет её, а возвращает новую строку. Давайте проверим всё это на примере:
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); // batlet pet = "cat"кладёт в переменную строку"cat".pet[0] = "b"пытается заменить первую букву, но строка не меняется, и программа печатаетcat.pet.toUpperCase()возвращает новую строку"CAT", и её сохраняетloud. Самаpetпо-прежнемуcat.pet = "b" + pet[1] + pet[2]собирает новую строку"bat"и кладёт её в переменную. Это и есть новая табличка вместо старой.
Здесь аналогия заканчивается: старую табличку не нужно снимать и выбрасывать. Когда строка больше никому не нужна, JavaScript сам освобождает занятую ею память.
Присваивание pet[0] = "b" молча пропускается только в обычном скрипте. В строгом режиме, с "use strict" в начале файла, то же присваивание останавливает программу. Это текст Node.js и Chrome:
TypeError: Cannot assign to read only property '0' of string 'cat'Этот вопрос часто задают на собеседовании: «Можно ли изменить символ строки?» Ответ состоит из двух частей:
- нет, строки неизменяемые, а методы и
+создают новую строку; - запись по индексу молча пропускается, а в строгом режиме останавливает программу с
TypeError.
Частая ошибка
Метод вызвали, а его результат никуда не положили:
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 и подпишись на канал — откроются все уроки.