JavaScript: Извлечение символов из строки
Иногда нужно получить один символ из строки. Например, если сайт знает имя и фамилию пользователя и нужно вывести их в сокращённом формате вида A. Ivanov. Для этого потребуется взять первую букву имени.
В JavaScript для доступа к символам строки используют индексацию. Индексация означает, что у каждого символа в строке есть свой номер, то есть индекс. Индексация начинается с нуля: у первого символа индекс 0, у второго 1 и так далее. Представим, что у нас есть строка:
const firstName = 'Alexander';Чтобы получить первую букву, указываем её позицию (индекс) в квадратных скобках:
console.log(firstName[0]); // => AИндексы в JavaScript (и во многих языках) начинаются с нуля:
Символ A l e x a n d e r
Индекс 0 1 2 3 4 5 6 7 8Длина строки Alexander равна 9, поэтому индекс последнего символа равен 8, то есть 9 - 1. Длину строки можно узнать с помощью функции length():
import { length } from 'hexlet-basics/string';
console.log(length(firstName)); // => 9
console.log(firstName[length(firstName) - 1]); // => rСтрока import в начале файла подключает учебную функцию length() из библиотеки — её нужно просто скопировать как есть. Как устроены импорты, разберём в уроках про модули.
Если изменится длина строки, то последний символ тоже сдвинется, и придётся снова вычислять его индекс.
Выход за границы строки
В отличие от некоторых языков, в JavaScript обращение к несуществующему индексу не вызывает ошибку — возвращается специальное значение undefined. Это «ничего нет» в мире JavaScript; подробно разберём его в модуле про типы данных.
console.log(firstName[9]); // => undefinedПоэтому в программировании принято проверять длину строки и обращаться к её символам, только если это безопасно. Мы дойдём до этого в будущих уроках.
Извлечение символов с конца
В некоторых языках (например, в Python) для доступа к символам с конца используют отрицательные индексы. В JavaScript квадратные скобки отрицательные индексы не понимают — firstName[-1] вернёт undefined. Поэтому индекс символа с конца вычисляют через длину строки:
import { length } from 'hexlet-basics/string';
const word = 'Hexlet';
console.log(word[length(word) - 1]); // => t, последний символ
console.log(word[length(word) - 2]); // => e, предпоследний символСтрока: 'H' 'e' 'x' 'l' 'e' 't'
Индекс: 0 1 2 3 4 5Здесь length(word) равно 6, поэтому последний символ имеет индекс length(word) - 1, то есть 5. Такой подход работает правильно даже если строка меняет длину.
Индекс можно хранить в переменной:
const index = 0;
console.log(word[index]); // => HТакой подход полезен, когда индекс вычисляется где-то в коде, а потом используется для доступа к нужному символу.
Спецсимволы
При индексации учитываются обычные буквы, знаки и спецсимволы. Все они занимают позицию в строке и имеют свой индекс, даже если их «не видно» на экране.
Например, в строке '\nyou' первый символ представляет собой \n (перенос строки), а под индексом 1 уже идёт буква y. Поэтому обращение magic[1] вернёт именно y.
Подумайте: что выведет этот код?
const magic = '\nyou';
console.log(magic[1]); // => ?Вывод будет:
yЗадание
В строке text спрятано секретное слово. Извлеките нужные символы из переменной text по индексам, соедините их и выведите на экран слово grip.
Полезное
JavaScript: Извлечение символов из строки
Иногда нужно получить один символ из строки. Например, если сайт знает имя и фамилию пользователя и нужно вывести их в сокращённом формате вида A. Ivanov. Для этого потребуется взять первую букву имени.
В JavaScript для доступа к символам строки используют индексацию. Индексация означает, что у каждого символа в строке есть свой номер, то есть индекс. Индексация начинается с нуля: у первого символа индекс 0, у второго 1 и так далее. Представим, что у нас есть строка:
const firstName = 'Alexander';Чтобы получить первую букву, указываем её позицию (индекс) в квадратных скобках:
console.log(firstName[0]); // => AИндексы в JavaScript (и во многих языках) начинаются с нуля:
Символ A l e x a n d e r
Индекс 0 1 2 3 4 5 6 7 8Длина строки Alexander равна 9, поэтому индекс последнего символа равен 8, то есть 9 - 1. Длину строки можно узнать с помощью функции length():
import { length } from 'hexlet-basics/string';
console.log(length(firstName)); // => 9
console.log(firstName[length(firstName) - 1]); // => rСтрока import в начале файла подключает учебную функцию length() из библиотеки — её нужно просто скопировать как есть. Как устроены импорты, разберём в уроках про модули.
Если изменится длина строки, то последний символ тоже сдвинется, и придётся снова вычислять его индекс.
Выход за границы строки
В отличие от некоторых языков, в JavaScript обращение к несуществующему индексу не вызывает ошибку — возвращается специальное значение undefined. Это «ничего нет» в мире JavaScript; подробно разберём его в модуле про типы данных.
console.log(firstName[9]); // => undefinedПоэтому в программировании принято проверять длину строки и обращаться к её символам, только если это безопасно. Мы дойдём до этого в будущих уроках.
Извлечение символов с конца
В некоторых языках (например, в Python) для доступа к символам с конца используют отрицательные индексы. В JavaScript квадратные скобки отрицательные индексы не понимают — firstName[-1] вернёт undefined. Поэтому индекс символа с конца вычисляют через длину строки:
import { length } from 'hexlet-basics/string';
const word = 'Hexlet';
console.log(word[length(word) - 1]); // => t, последний символ
console.log(word[length(word) - 2]); // => e, предпоследний символСтрока: 'H' 'e' 'x' 'l' 'e' 't'
Индекс: 0 1 2 3 4 5Здесь length(word) равно 6, поэтому последний символ имеет индекс length(word) - 1, то есть 5. Такой подход работает правильно даже если строка меняет длину.
Индекс можно хранить в переменной:
const index = 0;
console.log(word[index]); // => HТакой подход полезен, когда индекс вычисляется где-то в коде, а потом используется для доступа к нужному символу.
Спецсимволы
При индексации учитываются обычные буквы, знаки и спецсимволы. Все они занимают позицию в строке и имеют свой индекс, даже если их «не видно» на экране.
Например, в строке '\nyou' первый символ представляет собой \n (перенос строки), а под индексом 1 уже идёт буква y. Поэтому обращение magic[1] вернёт именно y.
Подумайте: что выведет этот код?
const magic = '\nyou';
console.log(magic[1]); // => ?Вывод будет:
yЗадание
В строке text спрятано секретное слово. Извлеките нужные символы из переменной text по индексам, соедините их и выведите на экран слово grip.
Полезное
Ваше упражнение проверяется по этим тестам
// @ts-check
import { expect, test, vi } from 'vitest';
test('symbols', async () => {
const consoleLogSpy = vi.spyOn(console, 'log');
await import('./index.js');
const firstArg = consoleLogSpy.mock.calls.join('\n');
expect(firstArg).toBe('grip');
});Решение учителя откроется через:
20:00
