Kapitel 51. Eingebaute JavaScript-Objekte

Jeder Entwickler kennt es, wie nervig plötzliche „Magie” in JavaScript sein kann: Zahlen verwandeln sich in Infinity, der String „123px” wird plötzlich zu 123, und NaN verhält sich, als hätte es eigene Gesetze. Besonders schmerzhaft wird es, wenn all das sauber in eine C++/Qt-Anwendung integriert werden muss, ohne die Kontrolle über die Logik zu verlieren.

Dieses Kapitel zeigt, wie eingebaute JavaScript-Objekte aufgebaut sind und warum professionelle Entwickler sich auf sie verlassen, um vorhersagbare Skripte zu schreiben. Sie werden unerwartete Stellen entdecken, an denen „Typisierung nach Laune” Berechnungen zerstört, und das Geheimnis erfahren, wie man Daten schnell auf Korrektheit prüft, bevor sie in den Qt-Code gelangen – dadurch sparen Sie Stunden beim Debugging und erhöhen die Zuverlässigkeit.

Im Inneren – 6 wichtige Objektfamilien: Global (und seine Erweiterung aus Qt), Number (Grenzen, isFinite/isNaN), String (replace/substring/slice + includes/startsWith), RegExp (test/search/match/split und Ersetzung durch Funktionen), Array (push/splice/sort/spread), Date und Math (Präzision, Rundungen, sqrt, random).

Wenn Sie dieses Kapitel nicht zu Ende lesen, verpassen Sie leicht ein paar „kleine” Nuancen, die sich später in große Bugs verwandeln.

Das Kapitel enthält Code-Beispiele, die sofort einsatzbereit sind.

Selbsttest zum Kapitel

Warum wird das Erstellen eines Boolean-Objekts in JavaScript nicht empfohlen, obwohl ein solches Objekt existiert?Antwort
Richtige Antwort: Ein Boolean-Objekt wird immer zu true konvertiert (sogar new Boolean(false)), was Verwirrung stiftet. Besser ist es, primitive Werte true/false zu verwenden, die sich vorhersagbar verhalten.
Welche sechs Werte in JavaScript werden bei logischer Konvertierung zu false umgewandelt?Antwort
Richtige Antwort: Das sind 0, null, false, NaN, undefined und der leere String (“”). Alle anderen Werte, einschließlich leerer Arrays und Objekte, werden zu true konvertiert.
Warum gibt die Methode Number.isNaN(“hello”) false zurück, obwohl der String offensichtlich keine Zahl ist?Antwort
Richtige Antwort: Number.isNaN() prüft, ob der Wert genau NaN ist, nicht “keine Zahl überhaupt”. Der String “hello” ist ein String, kein NaN-Wert. Für die Prüfung “keine Zahl” muss isNaN() ohne Number verwendet werden.
Was passiert, wenn in der Methode splice() der zweite Parameter auf 0 gesetzt wird?Antwort
Richtige Antwort: Elemente werden an der angegebenen Position eingefügt, ohne bestehende Elemente zu löschen, da der zweite Parameter die Anzahl der zu löschenden Elemente festlegt.
Warum werden in JavaScript Monate im Date-Objekt ab 0 nummeriert, während Monatstage bei 1 beginnen?Antwort
Richtige Antwort: Das ist ein historisches Erbe von Java, wo Monate als Array-Indizes (0-11) dargestellt werden, während Monatstage als Kalenderzahlen (1-31) gelten. Das führt zu Verwirrung, wird aber aus Gründen der Rückwärtskompatibilität beibehalten.
Welche fundamentale Einschränkung entsteht durch die Speicherung von Datumsangaben in Millisekunden seit dem 1. Januar 1970?Antwort
Richtige Antwort: Die Verwendung von Datumsangaben vor 1970 wird problematisch, obwohl moderne Implementierungen negative Werte für Datumsangaben vor diesem Referenzpunkt (Unix-Epoche) unterstützen.
Was ist der Unterschied zwischen den Methoden Math.ceil() und Math.floor() bei negativen Zahlen?Antwort
Richtige Antwort: ceil() rundet zum größeren Wert (Math.ceil(-5.5) = -5), während floor() zum kleineren Wert rundet (Math.floor(-5.5) = -6). Bei negativen Zahlen bedeutet “größer” näher an Null.
Warum ist das Erstellen von Funktionen über new Function() langsamer als die Deklaration normaler Funktionen?Antwort
Richtige Antwort: Weil die Übersetzung (Kompilierung) des Function-Codes bei jeder Verwendung zur Laufzeit erfolgt, während normale Funktionen einmal beim Laden des Skripts kompiliert werden.
Was gibt der Ausdruck [“10”, “5”, “40”].sort() zurück und warum kann das Ergebnis unerwartet sein?Antwort
Richtige Antwort: Er gibt [“10”, “40”, “5”] zurück, weil sort() standardmäßig Elemente lexikografisch als Strings vergleicht. Für numerisches Sortieren wird eine Vergleichsfunktion benötigt: sort((a,b) => a – b).
Wie erhält man alle Übereinstimmungen eines regulären Ausdrucks in einem String mit der Methode match()?Antwort
Richtige Antwort: Man muss das globale Flag g im regulären Ausdruck verwenden: str.match(/\d+/g). Ohne das Flag g gibt die Methode nur die erste Übereinstimmung zurück.
Warum ist die Methode push() oft vorzuziehen gegenüber direkter Zuweisung per Index zum Hinzufügen von Elementen zum Array?Antwort
Richtige Antwort: push() fügt automatisch am Ende hinzu, ohne die Länge des Arrays kennen zu müssen, und gibt die neue Länge zurück. Direkte Zuweisung kann “Löcher” im Array erzeugen, wenn der Index größer als die Länge ist.
Was passiert, wenn man eine negative Zahl an Math.sqrt() übergibt?Antwort
Richtige Antwort: Die Methode gibt NaN (Not a Number) zurück, da die Quadratwurzel einer negativen Zahl in reellen Zahlen nicht definiert ist.
Wie findet man mit dem Spread-Operator () den Maximalwert in einem Zahlen-Array?Antwort
Richtige Antwort: Math.max(…arr) — der Spread-Operator entpackt das Array in einzelne Argumente für die max()-Methode, die mehrere Parameter akzeptiert, nicht ein Array.
Warum sind die Methoden trim(), trimStart() und trimEnd() bei der Verarbeitung von Benutzereingaben nützlich?Antwort
Richtige Antwort: Sie entfernen zufällige Leerzeichen, die der Benutzer bei der Eingabe hinzugefügt haben könnte, was die Validierung und den Vergleich von Daten zuverlässiger macht und Formatierungsprobleme beseitigt.
Was ist der Vorteil der replace()-Methode mit einer Callback-Funktion anstelle eines einfachen Ersetzungs-Strings?Antwort
Richtige Antwort: Die Funktion ermöglicht es, die Ersetzung für jede Übereinstimmung dynamisch zu berechnen, was die Transformation gefundener Werte ermöglicht (z.B. Zahlen multiplizieren, Groß-/Kleinschreibung ändern) anstelle einfacher Substitution.

Praktische Aufgaben

Einfaches Level

String-Validator mit Filterung
Erstellen Sie eine Funktion, die ein Array von Strings akzeptiert und ein neues Array zurückgibt, das nur die Strings enthält, die: (1) länger als 3 Zeichen sind, (2) keine Ziffern enthalten, (3) von Leerzeichen befreit sind. Zum Beispiel sollte [” hello “, “hi”, “test123”, “world”] [“hello”, “world”] zurückgeben.
Hinweise: Verwenden Sie die Methoden filter(), trim(), length und den regulären Ausdruck /\d/.test() zur Überprüfung auf Ziffern. Kombinieren Sie die Bedingungen in der Prädikatfunktion für filter().

Mittleres Level

Zeitreihen-Analysator
Erstellen Sie eine Funktion, die ein Array von Date-Objekten akzeptiert und Statistiken zurückgibt: Anzahl der Daten in jedem Monat des Jahres, frühestes und spätestes Datum sowie durchschnittliche Anzahl von Tagen zwischen aufeinanderfolgenden Daten. Beachten Sie, dass das Array möglicherweise nicht sortiert ist.
Hinweise: Verwenden Sie getMonth() zum Gruppieren nach Monaten, Math.min/max mit dem Spread-Operator zum Finden der Extremdaten, sort() zum Sortieren des Arrays. Zur Berechnung der Differenz in Tagen zwischen Daten subtrahieren Sie die Millisekunden und teilen durch (1000 * 60 * 60 * 24).

Schwieriges Level

Intelligenter mathematischer Ausdrucks-Parser
Erstellen Sie eine Taschenrechner-Funktion, die einen String mit einem mathematischen Ausdruck akzeptiert (z.B. “2 * (3 + sqrt(16)) / abs(-4)”) und das Ergebnis berechnet. Die Funktion sollte unterstützen: grundlegende Operationen (+, -, *, /), Klammern, mathematische Funktionen aus Math (sqrt, abs, pow, sin, cos), und einen Fehler bei ungültiger Syntax zurückgeben.
Hinweise: Verwenden Sie RegExp zum Ersetzen mathematischer Funktionen durch ihre Aufrufe (replace(/sqrt\((\d+)\)/g, match => Math.sqrt(…))), bereinigen Sie den String von Leerzeichen mit trim(), verwenden Sie eval() vorsichtig oder erstellen Sie Function() für sichere Ausführung. Wickeln Sie es in try-catch zur Fehlerbehandlung ein. Erwägen Sie die Verwendung von replace() mit einer Funktion zum Ersetzen aller Math-Funktionen.

💬 Treten Sie der Diskussion bei!

Haben Sie die Feinheiten der eingebauten JavaScript-Objekte verstanden? Unerwartetes Verhalten von Math oder Date entdeckt?

Teilen Sie Ihre Lösungen zu den praktischen Aufgaben, diskutieren Sie Best Practices für die Arbeit mit Arrays und regulären Ausdrücken oder helfen Sie anderen Lesern, die Tricks der Sprache zu verstehen!

Leave a Reply

Your email address will not be published. Required fields are marked *