String.prototype.charAt()
Метод charAt()
значень String
повертає новий рядок, що складається з єдиної кодової одиниці UTF-16, знайденої в рядку за переданою позицією.
Спробуйте його в дії
Синтаксис
charAt(index)
Параметри
index
Ціле число в діапазоні від
0
і доstr.length - 1
. Якщоindex
неможливо перетворити на число, або його просто не задано — замість нього буде використано усталене значення0
, і таким чином – повернено перший символ рядкаstr
.
Повернене значення
Рядок, що відповідає одному символу (рівно одній кодовій одиниці UTF-16) за вказаним індексом index
. Якщо значення index
виходить за межі допустимого діапазону, метод charAt()
поверне порожній рядок.
Опис
Символи в рядках індексуються зліва направо. Індексом першого елемента є 0
, а індекс останнього символу в рядку, який, приміром, називається stringName
, дорівнює значенню виразу stringName.length - 1
. Якщо індекс, який передається в метод, виходить за межі цього діапазону, JavaScript поверне порожній рядок.
Якщо в index
до методу charAt()
не було передано ніякого значення — буде використано усталене, яке дорівнює 0
.
Приклади
Демонстрація символів, які знаходяться в різних місцях рядка
Наступний приклад вибирає символи з різних місць рядка "Прекрасний новий світ
" і друкує їх на екран:
const anyString = "Прекрасний новий світ";
console.log(`За індексом 0 знаходиться символ '${anyString.charAt()}'`);
// Ніякого індексу в метод не передано, використовується усталене значення 0
console.log(`За індексом 0 знаходиться символ '${anyString.charAt(0)}'`);
console.log(`За індексом 1 знаходиться символ '${anyString.charAt(1)}'`);
console.log(`За індексом 2 знаходиться символ '${anyString.charAt(2)}'`);
console.log(`За індексом 3 знаходиться символ '${anyString.charAt(3)}'`);
console.log(`За індексом 4 знаходиться символ '${anyString.charAt(4)}'`);
console.log(`За індексом 999 знаходиться символ '${anyString.charAt(999)}'`);
Ці рядки виведуть на екран наступне:
За індексом 0 знаходиться символ 'П'
За індексом 0 знаходиться символ 'П'
За індексом 1 знаходиться символ 'р'
За індексом 2 знаходиться символ 'е'
За індексом 3 знаходиться символ 'к'
За індексом 4 знаходиться символ 'р'
За індексом 999 знаходиться символ ''
Отримання цілих символів
Наступний код дає змогу пересвідчитись, що під час проходження по рядку цикл завжди віддасть цілий символ, навіть якщо рядок містить символи, що не належать базовому багатомовному плану.
let str = "A\uD87E\uDC04Z"; // Також можна було б безпосередньо вжити не-BMP символ
for (let i = 0, chr; i < str.length; i++) {
[chr, i] = getWholeCharAndI(str, i);
// Цей код прилаштовується вгорі кожного циклу. Всередину передаються
// цілий рядок та індекс ітерації, а повертається масив з окремим символом та
// новим значенням 'i' (яке змінюється лише під час обробки сурогатної пари)
console.log(chr);
}
function getWholeCharAndI(str, i) {
let code = str.charCodeAt(i);
if (Number.isNaN(code)) {
return ""; // Позиція не знайдена
}
if (code < 0xd800 || code > 0xdfff) {
return [str.charAt(i), i]; // Звичайний символ, зберігаємо значення 'i' без змін
}
// Старший сурогатний символ (останнє шістнадцяткове значення можна
// замінити на 0xDB7F, щоб повернути старший сурогат як окремий символ)
if (0xd800 <= code && code <= 0xdbff) {
if (str.length <= i + 1) {
throw new Error(
"Старший сурогат без наступного молодшого сурогатного символа"
);
}
const next = str.charCodeAt(i + 1);
if (next < 0xdc00 || next > 0xdfff) {
throw new Error(
"Старший сурогат без наступного молодшого сурогатного символа"
);
}
return [str.charAt(i) + str.charAt(i + 1), i + 1];
}
// Молодший сурогат (0xDC00 <= code && code <= 0xDFFF)
if (i === 0) {
throw new Error(
"Молодший сурогат без попереднього старшого сурогатного символа"
);
}
const prev = str.charCodeAt(i - 1);
// (тут можна замінити останнє шістнадцяткове значення на 0xDB7F, щоб повернути
// старший сурогат окремим символом приватного плану unicode)
if (prev < 0xd800 || prev > 0xdbff) {
throw new Error(
"Молодший сурогат без попереднього старшого сурогатного символа"
);
}
// Натомість повертається наступний символ (та збільшується індекс ітерацій)
return [str.charAt(i + 1), i + 1];
}
Виправлення методу charAt() так, щоб він підтримував не лише символи Базового багатомовного плану (BMP)
Хоча попередній приклад може бути кориснішим для програм з обов'язковою підтримкою не-BMP символів (оскільки він не вимагає знання про те, де саме знаходиться якийсь не-BMP символ), в деяких випадках може виникнути потреба вибирати символи за індексом, і при цьому обробляти сурогатні пари як один символ. В такому разі можна використати наступний код:
function fixedCharAt(str, idx) {
str = String(str);
const surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
while (surrogatePairs.exec(str) !== null) {
const lastIdx = surrogatePairs.lastIndex;
if (lastIdx - 2 < idx) {
idx++;
} else {
break;
}
}
if (idx >= str.length || idx < 0) {
return "";
}
let ret = str.charAt(idx);
if (
/[\uD800-\uDBFF]/.test(ret) &&
/[\uDC00-\uDFFF]/.test(str.charAt(idx + 1))
) {
// Вперед на одну позицію, оскільки один із "символів" — це частина сурогатної пари
ret += str.charAt(idx + 1);
}
return ret;
}
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
charAt
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 3 | Opera Full support 3 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |