Signatur
Beschreibung
charAt() liest ein einzelnes Zeichen – genauer: eine einzelne UTF-16-Codeeinheit – aus einem String und gibt es als neuen String der Länge 1 zurück. Die Zählung beginnt bei 0, das letzte Zeichen liegt bei str.length - 1.
Anders als der Zugriff über eckige Klammern (str[i]) liefert charAt() bei einem ungültigen Index keinen undefined-Wert, sondern einen leeren String "". Das ist praktisch, wenn man das Ergebnis direkt weiterverarbeiten möchte (z. B. mit toUpperCase()), ohne vorher auf undefined zu prüfen.
Der Parameter wird in eine Ganzzahl umgewandelt: Nachkommastellen werden abgeschnitten, NaN oder ein fehlendes Argument werden zu 0. Negative Indizes werden nicht vom Ende her gezählt – dafür gibt es String.prototype.at().
Da charAt() mit Codeeinheiten arbeitet, zerlegt es Zeichen außerhalb der Basic Multilingual Plane (z. B. Emojis oder seltene CJK-Zeichen), die als Surrogatpaar gespeichert sind, in zwei unbrauchbare Hälften. Für vollständige Unicode-Zeichen sollte man codePointAt(), Array.from(str) oder den Spread-Operator verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $index | number | 0 | Nullbasierte Position des gewünschten Zeichens. Wird per ToIntegerOrInfinity umgewandelt (Nachkommastellen abgeschnitten, NaN → 0). Liegt der Wert außerhalb von 0 bis length - 1, wird "" zurückgegeben. |
Rückgabewert
"", wenn index außerhalb des gültigen Bereichs liegt.Beispiele
Grundlegender Zugriff und ungültige Indizes
const wort = 'JavaScript';
console.log(wort.charAt(0)); // erstes Zeichen
console.log(wort.charAt(4)); // fünftes Zeichen
console.log(wort.charAt(wort.length - 1)); // letztes Zeichen
console.log(JSON.stringify(wort.charAt(99))); // außerhalb
console.log(JSON.stringify(wort.charAt(-1))); // negativ → kein Zählen vom Ende
console.log(wort.charAt()); // ohne Argument → Index 0
console.log(wort.charAt(2.9)); // wird auf 2 abgeschnitten
Ersten Buchstaben großschreiben – auch bei leerem String sicher
const capitalize = (text) =>
text.charAt(0).toUpperCase() + text.slice(1);
console.log(capitalize('hallo welt'));
console.log(JSON.stringify(capitalize(''))); // kein TypeError, da charAt '' liefert
// Zum Vergleich: text[0] wäre bei '' undefined → undefined.toUpperCase() wirft
Initialen aus einem Namen bilden
const initialen = (name) =>
name
.trim()
.split(/\s+/)
.map((teil) => teil.charAt(0).toUpperCase())
.join('');
console.log(initialen('ada lovelace'));
console.log(initialen(' Grace Brewster Hopper '));
Fallstrick: Emojis und Surrogatpaare
const text = '😀 Hi';
console.log(text.length); // 5 Codeeinheiten, nicht 4 Zeichen
console.log(text.charAt(0) === '\uD83D'); // nur die obere Surrogat-Hälfte
// Korrekt: nach Codepunkten zerlegen
const zeichen = [...text];
console.log(zeichen[0]);
console.log(String.fromCodePoint(text.codePointAt(0)));
// Wichtig · Fallstricke
- Negative Indizes:
charAt(-1)liefert"", nicht das letzte Zeichen. Für den Zugriff vom Ende herstr.at(-1)(ES2022) verwenden – das liefert bei ungültigem Index allerdingsundefined. - Unterschied zu
str[i]: Die Klammer-Notation gibt bei ungültigem Indexundefinedzurück,charAt()gibt""zurück. Sonst verhalten sich beide gleich. - Unicode:
charAt()arbeitet mit UTF-16-Codeeinheiten. Emojis, viele mathematische Symbole und seltene Schriftzeichen bestehen aus zwei Codeeinheiten (Surrogatpaar) und werden zerteilt. Graphem-Cluster wie 👨👩👧 oder Buchstaben mit kombinierenden Akzenten bestehen sogar aus mehreren Codepunkten – dafürIntl.Segmenterverwenden. - Typumwandlung: Nicht-numerische Argumente werden umgewandelt:
charAt('2')→ Index 2,charAt('abc')→NaN→ Index 0. Das kann Fehler verschleiern. - Kompatibilität: Seit der ersten ECMAScript-Version in allen Browsern und in Node.js verfügbar.