String vs string in TypeScript: Performance-Unterschied und Wahl

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

String vs string: Der stille Performance-Killer in Ihrem Code

\n\n

Haben Sie sich jemals gefragt, warum TypeScript an einer Stelle String bemängelt und an einer anderen string? Oder haben Sie gesehen, wie erfahrene Entwickler das Gesicht verziehen, wenn sie new String("hallo") sehen? Diese Frage ist ein echter Dauerbrenner auf Stack Overflow mit tausenden von Aufrufen. Und das zu Recht. Der Unterschied zwischen String und string ist keine bloße Marotte der Sprache, sondern ein fundamentaler Unterschied, der Performance, Sicherheit und Lesbarkeit Ihres Codes beeinflusst.

\n\n

In diesem Artikel geben wir nicht nur eine trockene Definition. Wir analysieren, was hinter jedem dieser Typen steckt, wie sie sich zur Laufzeit verhalten und warum die richtige Wahl Ihre Anwendung um dutzende Prozent beschleunigen kann. Machen Sie sich bereit, es wird spannend!

\n\n

Primitive vs. Objekte: Die Grundlagen

\n\n

Um den Unterschied zu verstehen, müssen wir uns daran erinnern, wie JavaScript (und damit auch TypeScript) mit Daten arbeitet. Die Sprache kennt zwei Arten von Werten:

\n\n
    \n
  • Primitive Typen: string, number, boolean, null, undefined, symbol, bigint. Sie sind unveränderlich und werden als Wert gespeichert.
  • \n
  • Objekte: Object, Array, Function, sowie String (großgeschrieben), Number, Boolean. Sie sind veränderlich und werden als Referenz gespeichert.
  • \n
\n\n

Wenn Sie let name: string = "Alice" schreiben, erstellen Sie einen primitiven Wert. Wenn Sie let name: String = new String("Alice") schreiben, erstellen Sie ein Objekt-Wrapper. Und hier wird es interessant.

\n\n

Der Typ string (kleingeschrieben)

\n

Dies ist ein primitiver Typ. Er wird in 99,9% der Fälle verwendet. Er ist leichtgewichtig, schnell und vorhersagbar. Der Vergleich zweier primitiver Werte erfolgt nach ihrem Wert:

\n\n
let a: string = "hallo";\nlet b: string = "hallo";\nconsole.log(a === b); // true
\n\n

TypeScript empfiehlt, genau diesen Typ zu verwenden. Es ist der De-facto-Standard für die Deklaration von String-Variablen, Funktionsparametern und Rückgabewerten.

\n\n

Der Typ String (großgeschrieben)

\n

Dies ist ein Objekt-Typ, ein Konstruktor-Wrapper. Er existiert seit den Anfängen von JavaScript für die Arbeit mit String-Methoden. Seine direkte Verwendung gilt jedoch eher als Anti-Pattern, es sei denn, Sie haben eine sehr spezielle Aufgabe. Der Vergleich zweier String-Objekte erfolgt nach ihrer Referenz:

\n\n
let a: String = new String("hallo");\nlet b: String = new String("hallo");\nconsole.log(a === b); // false! Es sind unterschiedliche Objekte im Speicher
\n\n

Dies kann zu schwer auffindbaren Fehlern führen. Stellen Sie sich vor, Sie prüfen, ob der Wert einer Zeichenkette "hallo" ist, und erhalten false, nur weil jemand new String() verwendet hat.

\n\n

Performance: Warum gewinnt string?

\n\n

Kommen wir nun zum spannendsten Teil – zu Zahlen und Optimierung. Schreiben wir einen einfachen Performance-Test (Sie können ihn in Ihrer Umgebung ausführen, z.B. in Node.js oder im Browser).

\n\n
// Performance-Test\nconst iterations = 1_000_000;\n\nconsole.time("string (primitiv)");\nlet sum = "";\nfor (let i = 0; i < iterations; i++) {\n    sum += "a";\n}\nconsole.timeEnd("string (primitiv)");\n\nconsole.time("String (Objekt)");\nlet sumObj = new String("");\nfor (let i = 0; i < iterations; i++) {\n    sumObj += "a"; // Hier findet Auto-Boxing und Unboxing statt\n}\nconsole.timeEnd("String (Objekt)");
\n\n

Das Ergebnis auf einem typischen Rechner wird drastisch unterschiedlich sein (2-5 mal schneller für den primitiven Typ). Warum? Weil:

\n
    \n
  • Der primitive Typ string ist einfach eine Zeichenkette im Speicher. Operationen damit sind auf Engine-Ebene optimiert.

Blogs

Buchempfehlungen