Start · Sprachen · JavaScript · Referenz · String.prototype.charAt()

String.prototype.charAt()

Methode

Gibt einen neuen String mit der einzelnen UTF-16-Codeeinheit an der Position <code>index</code> zurück – oder einen leeren String, wenn der Index außerhalb liegt.

seit JavaScript ES1 – Baseline: alle Browser Kategorie: method-property

Signatur

String.prototype.charAt(index)

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

Typ
string
Beschreibung
Ein String mit genau einer UTF-16-Codeeinheit an der angegebenen Position, oder ein leerer String "", 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
J S t "" "" J v

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
Hallo welt ""

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 '));
AL GBH

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)));
5 true 😀 😀

// Wichtig · Fallstricke

  • Negative Indizes: charAt(-1) liefert "", nicht das letzte Zeichen. Für den Zugriff vom Ende her str.at(-1) (ES2022) verwenden – das liefert bei ungültigem Index allerdings undefined.
  • Unterschied zu str[i]: Die Klammer-Notation gibt bei ungültigem Index undefined zurü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ür Intl.Segmenter verwenden.
  • 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.