CharAt: примеры (JAVASCRIPT)

Функция charAt в JavaScript: извлечение символов из строки
Раздел: Строки, Доступ к символам
charAt(index): string

Основы функции charAt

Метод charAt() принадлежит объектам типа String в JavaScript. Его основное назначение — возвращение символа, расположенного по указанному индексу в строке.

Индексация символов в строке начинается с нуля. Таким образом, первый символ имеет индекс 0, второй — 1 и так далее.

Функция используется, когда требуется получить конкретный символ из строки, не преобразуя её в массив. Это распространённая операция при анализе, валидации или поэлементной обработке текстовых данных.

Аргументы

Метод принимает один обязательный аргумент:

  • index (Число): Целое число, представляющее позицию символа, который нужно извлечь. Если индекс не является числом, он будет преобразован в число.

Возвращаемое значение

Метод возвращает строку, состоящую из одного символа, находящегося по указанной позиции.

  • Если указанный индекс находится в диапазоне от 0 до str.length - 1, возвращается соответствующий символ.
  • Если индекс меньше 0 или больше/равен длине строки (str.length), метод возвращает пустую строку ('').

Простые примеры использования

Базовое применение для получения символа по индексу:

let str = 'Привет'; 
console.log(str.charAt(0));
'П'

Использование индекса за пределами строки:

let str = 'Привет';
console.log(`'${str.charAt(-1)}'`);
console.log(`'${str.charAt(100)}'`);
''
''

Автоматическое преобразование аргумента к числу:

let str = 'Hello';
console.log(str.charAt('2'));
console.log(str.charAt(2.9));
'l'
'l'

Похожие методы в JavaScript

В JavaScript существуют альтернативные способы доступа к символам строки.

  • Квадратные скобки []: Позволяют получить символ по индексу, как в массиве. Основное отличие — при выходе за границы строки возвращается undefined, а не пустая строка.
    let str = 'Мир';
    console.log(str[1]);
    console.log(str[10]);
    'и'
    undefined
  • String.prototype.charCodeAt(): Возвращает не символ, а числовое значение Юникода (кодовая точка UTF-16) для символа по указанному индексу.
    'abc'.charCodeAt(0);
    97
  • String.prototype.codePointAt(): Аналогичен charCodeAt(), но корректно работает с суррогатными парами и возвращает полную кодовую точку Юникода.

Метод charAt() предпочтительнее использовать, когда важна безопасность и гарантированный возврат строки (даже пустой). Квадратные скобки удобны для краткости, но требуют дополнительной проверки на undefined.

Распространённые ошибки

При работе с charAt() могут возникнуть некоторые типичные проблемы.

1. Ожидание изменения исходной строки: Метод не изменяет оригинальную строку, так как строки в JavaScript иммутабельны.

let word = 'Кот';
let letter = word.charAt(0);
console.log(word);
'Кот' // Исходная строка не изменилась

2. Сравнение результата с числом (кодом символа): charAt() возвращает строку, а не число.

console.log('5'.charAt(0) === 5); // Сравнение строки и числа
console.log('5'.charAt(0) == 5); // Нестрогое сравнение (работает, но нежелательно)
false
true

3. Забывание, что индексация с нуля: Попытка получить первый символ через индекс 1 — частая оплошность новичков.

let str = 'Первый';
console.log('Первый символ:', str.charAt(1));
Первый символ: е // Ошибка, это второй символ

4. Проблемы с символами вне базовой плоскости Юникода: Символы вроде эмодзи или некоторых иероглифов могут состоять из двух суррогатных половин (суррогатная пара). charAt() вернёт только одну половину.

let emoji = '????';
console.log(emoji.charAt(0));
console.log(emoji.length);
'�' (некорректный символ)
2 // Длина для JS равна 2

Изменения в спецификации

Метод charAt() присутствует в JavaScript с самых ранних версий (ECMAScript 1). Его поведение остаётся стабильным и неизменным на протяжении всех обновлений языка.

Важным контекстом является эволюция стандарта Unicode и работа с символами за пределами Базовой многоязыковой плоскости (BMP). Метод charAt() работает с кодовыми единицами UTF-16, а не с видимыми символами (графемами). Для современных реалий, где часто используются эмодзи и сложные символы, это может быть недостатком.

На смену для корректной работы со всеми символами Юникода пришёл метод String.prototype.codePointAt() (добавлен в ES6) и итерация по строке через for...of, которая учитывает суррогатные пары.

Таким образом, сам метод charAt() не менялся, но вокруг него появились более современные альтернативы для решения специфических задач.

Расширенные примеры применения

1. Поиск последнего символа строки:

Пример javascript
function getLastChar(str) {
  return str.charAt(str.length - 1);
}
console.log(getLastChar('JavaScript'));
console.log(getLastChar('')); // Пустая строка
't'
''

2. Проверка, является ли символ по индексу цифрой:

Пример javascript
function isDigitAt(str, index) {
  let char = str.charAt(index);
  return char >= '0' && char <= '9';
}
console.log(isDigitAt('A1B2C3', 1));
console.log(isDigitAt('A1B2C3', 0));
true
false

3. Итерация по строке с обработкой индексов:

Пример javascript
let result = '';
let text = 'Шифр';
for (let i = 0; i < text.length; i++) {
  result += `Символ ${i}: '${text.charAt(i)}'\n`;
}
console.log(result);
Символ 0: 'Ш'
Символ 1: 'и'
Символ 2: 'ф'
Символ 3: 'р'

4. Создание простого шифра (сдвиг символа):

Пример javascript
function caesarCipher(str, shift) {
  let output = '';
  for (let i = 0; i < str.length; i++) {
    let charCode = str.charCodeAt(i);
    // Упрощённо для латиницы
    if (charCode >= 65 && charCode <= 90) { // A-Z
      output += String.fromCharCode(((charCode - 65 + shift) % 26) + 65);
    } else if (charCode >= 97 && charCode <= 122) { // a-z
      output += String.fromCharCode(((charCode - 97 + shift) % 26) + 97);
    } else {
      output += str.charAt(i); // Остальные символы без изменения
    }
  }
  return output;
}
console.log(caesarCipher('Hello, World!', 3));
'Khoor, Zruog!'

5. Подсчёт количества определённого символа:

Пример javascript
function countChar(str, targetChar) {
  let count = 0;
  for (let i = 0; i < str.length; i++) {
    if (str.charAt(i) === targetChar) {
      count++;
    }
  }
  return count;
}
console.log(countChar('программирование', 'р'));
3

Аналоги в других языках программирования

Другие языки предоставляют схожую функциональность для доступа к символам строки.

PHP

Используется квадратные скобки или функция mb_substr() для многобайтовых кодировок.

$str = 'Тест';
echo $str[1]; // Для однобайтовых (ASCII)
echo mb_substr($str, 1, 1, 'UTF-8'); // Для UTF-8
'е'
'е'

Python

Доступ по индексу через квадратные скобки. При неверном индексе вызывает исключение IndexError.

text = 'Python'
print(text[2])
# print(text[20]) # Вызовет IndexError
't'

MySQL

Функция SUBSTRING() или её синоним SUBSTR().

SELECT SUBSTRING('MySQL', 2, 1);
'y'

C/C++

Символы строки (массивы char) доступны по индексу. В C++ для класса std::string используется метод at() или оператор [].

// C++
std::string s = 'Hello';
char c1 = s[1]; // 'e'
char c2 = s.at(1); // 'e' (проверяет границы)

Ключевое отличие JavaScript charAt() — его «безопасность», так как он возвращает пустую строку при неверном индексе, в то время как во многих языках это приводит к ошибке или неопределённому поведению.

JS charAt function comments

En
CharAt Returns the character at the specified index in a string