Variablen und Datentypen in JavaScript kennenlernen

Mach deine ersten Schritte mit JavaScript, der Sprache, die Webseiten interaktiv macht. Binde Skripte in eine HTML-Seite ein, speichere Werte mit let und const und rechne mit Zahlen, Zeichenketten und booleschen Werten. Lerne, wie JavaScript Typen umwandelt, damit dich Ergebnisse wie "5" + 2 mit dem Wert "52" nicht mehr überraschen. Triff Entscheidungen mit Vergleichen, logischen Operatoren, if/else und switch und finde und behebe Fehler mit der Browserkonsole und dem Debugger.

AnfängerEinheit 1 von 9 in Kurs: JavaScript – DOM, Ereignisse und asynchroner Code

Was du lernst

  1. Binde JavaScript in eine HTML-Seite ein, steuere den Ausführungszeitpunkt und nutze die Browserkonsole, um Code auszuführen und seine Ausgabe zu sehen.
    • Binde JavaScript in eine HTML-Seite ein
      Binde Skripte mit dem <script>-Element direkt oder aus einer separaten Datei ein und entscheide, wo sie stehen und wie sie geladen werden.
    • Schreibe Anweisungen und nutze die Konsole
      Schreibe Anweisungen und Kommentare, führe Code in der Browserkonsole aus und zeige Ausgaben mit console.log und den integrierten Dialogen des Browsers an.
  2. Deklariere Variablen mit verständlichen Namen, entscheide dich zwischen let und const und bestimme, wo jede Variable verwendet werden kann.
    • Deklariere und benenne Variablen
      Erstelle Variablen mit let und const, gib ihnen zulässige und lesbare Namen und aktualisiere diejenigen, die sich ändern.
    • Bestimme Gültigkeitsbereiche und erkenne mögliche Fehler bei let und const
      Bestimme, in welchem Teil des Codes eine Variable verwendet werden kann, und erkenne und behebe die Fehler, die let und const erzeugen.
  3. Erkenne die Datentypen von JavaScript, rechne korrekt mit Zahlen und erstelle und verändere Texte mit Zeichenketten und Template-Literalen.
    • Erkenne Datentypen mit typeof
      Benenne die Datentypen von JavaScript, unterscheide null von undefined und prüfe den Typ eines beliebigen Werts mit typeof.
    • Rechne mit Zahlen und arithmetischen Operatoren
      Verwende arithmetische Operatoren und Zuweisungsoperatoren, beachte die Operatorrangfolge, runde Ergebnisse und erkenne Grenzen der Gleitkommadarstellung und spezielle Zahlenwerte.
    • Erstelle und verändere Zeichenketten
      Schreibe Zeichenkettenliterale, füge Anführungszeichen und Sonderzeichen ein und nutze die Länge, Indexpositionen und gängige Methoden von Zeichenketten.
    • Erstelle Texte mit Template-Literalen
      Füge Werte und Ausdrücke mit Backtick-Zeichenketten in Text ein, schreibe mehrzeiligen Text und formatiere Zahlen innerhalb von Meldungen.
  4. Wandle Werte mit Number(), String() und Boolean() gezielt um und sage die automatischen Umwandlungen voraus, die JavaScript in Operatoren und Bedingungen vornimmt.
    • Wandle Werte gezielt um
      Wandle Text in Zahlen und andere Werte in Zeichenketten oder boolesche Werte um und prüfe, ob eine Umwandlung funktioniert hat.
    • Sage implizite Typumwandlungen voraus
      Sage die Ergebnisse von Operatoren bei gemischten Typen voraus und verwende Truthy- und Falsy-Werte gezielt.
  5. Vergleiche Werte korrekt, verknüpfe Bedingungen mit logischen Operatoren und wähle mit if, else, dem bedingten Operator und switch, welcher Code ausgeführt wird.
    • Vergleiche Werte
      Verwende Vergleichsoperatoren, um true oder false zu erzeugen, und sage Vergleiche von Zeichenketten, gemischten Typen, null, NaN und Dezimalzahlen voraus.
    • Verknüpfe Bedingungen mit logischen Operatoren
      Verknüpfe und negiere Bedingungen mit &&, || und !, nutze die Kurzschlussauswertung und lege mit || und ?? Standardwerte fest.
    • Wähle Ausführungszweige mit if, else, dem bedingten Operator und switch
      Schreibe Ketten aus if, else if und else, wähle Werte mit dem bedingten Operator und behandle feste Fälle mit switch.
  6. Lies Fehlermeldungen, verfolge Werte anhand von Konsolenausgaben und halte Code im Browser-Debugger an, um genau zu sehen, was er tut.
    • Lies Fehlermeldungen und verfolge Werte mit der Konsole
      Unterscheide Syntax-, Laufzeit- und logische Fehler, lies Fehlermeldungen und finde anhand ausgegebener Werte, wo ein Ergebnis falsch wird.
    • Halte die Ausführung an und gehe den Code mit dem Debugger schrittweise durch
      Setze Haltepunkte, gehe Code Zeile für Zeile durch und untersuche Variablenwerte, während der Code angehalten ist.

Variablen und Datentypen in JavaScript einfach erklärt

6 Kapitel

1

Führe ein Skript aus und sieh dir seine Ausgabe an

Ein Browser kann eine Berechnung ausführen, sobald du eine Seite lädst. Der Code braucht aber einen Platz und eine Möglichkeit, sein Ergebnis anzuzeigen. Binde ein Skript in HTML ein, wähle seinen Ausführungszeitpunkt und nutze die Konsole, um seine Meldungen zu sehen. Kleine Experimente in der Konsole helfen dir, die Sprache zu lernen, bevor du Seitenelemente veränderst. Du lernst auch den Unterschied zwischen dem Wert eines Ausdrucks und einer Meldung kennen, die ein Programm ausgibt.

1.1 Binde JavaScript in HTML ein

HTML gibt einer Seite ihre Struktur, CSS steuert ihr Aussehen und JavaScript ergänzt Verhalten. Die JavaScript-Engine eines Browsers führt die Anweisungen in einem Skript aus. Sofern keine Entscheidung den Ausführungsweg ändert, laufen diese Anweisungen von oben nach unten.

Code in die Seite oder in eine separate Datei schreiben

Ein Inline-Skript enthält JavaScript zwischen einem öffnenden und einem schließenden Tag:

<script>
  console.log("Hello from the page");
</script>

Bei einem externen Skript steht JavaScript in einer separaten .js-Datei. Dieses HTML lädt sie:

<script src="js/app.js"></script>

Die externe Datei enthält console.log("Hello from the page"); ohne <script>-Tags. Die Trennung der Dateien hält das HTML lesbar, ermöglicht mehreren Seiten die gemeinsame Nutzung von Code und erlaubt dem Browser, das Skript im Cache zu speichern. Ist src vorhanden, wird Code innerhalb desselben Elements ignoriert. Verwende pro Element eine der beiden Möglichkeiten und schreibe immer das schließende </script>-Tag: Ein selbstschließendes <script ... /> schließt das Element in HTML nicht.

Wähle den Ausführungszeitpunkt

Ein klassisches Skript ohne Ladeattribut unterbricht das Parsen des HTML, während der Browser es lädt und ausführt. In <head> wird es ausgeführt, bevor der spätere Inhalt des body aufgebaut wurde. Platzierst du es direkt vor </body>, steht der Seiteninhalt davor.

Für ein externes klassisches Skript in <head> ist defer ein nützlicher Standard:

<script src="js/app.js" defer></script>

Der Browser lädt das Skript herunter, während er das HTML weiter parst. Er führt es aus, nachdem das Parsen abgeschlossen ist. Mehrere verzögert ausgeführte Skripte laufen in ihrer HTML-Reihenfolge, sodass ein zweites Skript Werte nutzen kann, die das erste gesetzt hat.

LademethodeAusführungszeitpunktReihenfolge mehrerer Skripte
Klassisch, ohne AttributWenn das Parsen das Skript erreicht, nach dem LadenHTML-Reihenfolge
deferNach dem Parsen des HTMLHTML-Reihenfolge
asyncSobald der Download abgeschlossen istReihenfolge der abgeschlossenen Downloads

Verwende async für unabhängigen Code, der weder davon abhängt, dass die Seite bereit ist, noch von einem anderen Skript. Bei einem klassischen Inline-Skript hat defer keine Wirkung.

Lade ein Modul
<script type="module" src="js/main.js"></script>

Ein Modul wird standardmäßig verzögert und im strikten Modus ausgeführt. Es kann über import und export Code austauschen. Um Module in Chrome oder Firefox zu laden, stelle das Projekt über einen lokalen Entwicklungsserver bereit, etwa über die Funktion live-server eines Editors. Wird die Seite unter einer file://-Adresse geöffnet, gelten Einschränkungen beim Laden von Modulen.

Prüfe die Verbindung

Angenommen, index.html liegt neben einem Ordner js, der greet.js enthält. Schreibe console.log("Page ready"); in dieses Skript und <script src="js/greet.js" defer></script> in den head des HTML. Öffne die Seite und dann ihre Konsole: Die Meldung lautet „Page ready“.

Der relative Pfad beginnt beim Ordner der HTML-Datei. Bei dieser Anordnung zeigt src="greet.js" auf die falsche Stelle. Eine Meldung über eine fehlende Datei bedeutet, dass unter dieser Adresse kein Skript ausgeführt werden kann. Hast du die HTML-Tags in die JavaScript-Datei kopiert, meldet die Engine stattdessen einen Syntaxfehler beim Markup.

Wichtige Erkenntnisse

  • Ein externes Skript verwendet src; seine JavaScript-Datei enthält Code ohne HTML-Tags.
  • Ein relativer Skriptpfad beginnt beim Ordner der HTML-Datei.
  • Ein verzögert ausgeführtes externes klassisches Skript läuft nach dem Parsen; verzögert ausgeführte Skripte behalten die HTML-Reihenfolge bei.
  • Ein async-Skript wird ausgeführt, sobald es bereit ist; voneinander abhängige Skripte benötigen daher eine andere Lademethode.
  • Module werden standardmäßig verzögert ausgeführt und verwenden den strikten Modus.
  • Ein Skriptelement benötigt ein schließendes </script>-Tag.

1.2 Schreibe Anweisungen und untersuche die Konsole

Die Browserkonsole zeigt Meldungen, Fehler und die Ergebnisse von Code, den du eingibst. Öffne die Konsole für die Seite, die du testest. Verwende in Chrome oder Edge Ctrl+Shift+J unter Windows/Linux oder Cmd+Option+J auf dem Mac. In Firefox verwendest du Ctrl+Shift+K oder Cmd+Option+K. F12 öffnet in Chrome und Edge die Entwicklerwerkzeuge insgesamt.

Anweisungen und Ausdrücke

Ein Ausdruck erzeugt einen Wert: 4 + 5 erzeugt 9. Eine Anweisung gibt eine Instruktion, etwa diesen Wert zu speichern oder auszugeben:

let total = 4 + 5;
console.log("Total:", total);

Die erste Zeile wird vor der zweiten ausgeführt, die „Total: 9“ ausgibt. Ein Semikolon beendet eine Anweisung. JavaScript kann viele ausgelassene Semikolons einfügen, aber Zeilenumbrüche funktionieren nicht immer als Trennzeichen. Beende Anweisungen mit Semikolons, um die beabsichtigte Struktur deutlich zu machen.

Gib 2 + 3 in die Konsole ein und drücke die Eingabetaste, um 5 zu sehen. Verwende Shift+Enter für eine neue Zeile, ohne die Eingabe auszuführen. Wenn du let x = 5; eingibst, zeigt die Konsole möglicherweise undefined als Ergebnis dieser Anweisung an. Das bedeutet nicht, dass x den Wert undefined enthält: Gibst du danach x ein, erscheint 5. Ebenso gibt ein Aufruf von console.log() seine Meldung aus und liefert selbst undefined zurück.

Namen und Kommentare

JavaScript unterscheidet Groß- und Kleinschreibung. console.log("Hi"); funktioniert, aber Console.log("Hi"); verweist auf einen anderen Namen und löst einen ReferenceError aus. console.Log("Hi"); findet console, scheitert aber mit einem TypeError, weil es keine aufrufbare Methode Log gibt.

Kommentare sind für Leser bestimmt. Die Engine überspringt sie:

// Keep the starting value for the next calculation.
let total = 4;
/* A comment can also
   continue on another line. */
console.log(total);

Setzt du // vor eine Anweisung, schaltest du diese Zeile vorübergehend aus. Ein nützlicher Kommentar erklärt einen Grund, den der Code allein nicht deutlich macht.

Meldungen, Warnungen und Experimente

console.log("Total:", 9); gibt seine Argumente durch Leerzeichen getrennt aus. console.warn() kennzeichnet eine Warnung; console.error() kennzeichnet eine Fehlermeldung. Eine Ausgabe mit console.error() löst selbst keine Ausnahme aus. console.clear() leert die Anzeige.

Konsoleneingaben sind Experimente, keine gespeicherten Änderungen. Beim Neuladen werden die gespeicherten Seitenskripte erneut ausgeführt. Du kannst Variablen auf oberster Ebene klassischer Skripte in der Konsole untersuchen; Variablen auf oberster Ebene eines Moduls bleiben innerhalb dieses Moduls.

Einfache Dialoge und strikter Modus

alert("Saved!"); zeigt eine Meldung. confirm("Continue?") gibt für „OK“ true und für „Abbrechen“ false zurück. prompt("Quantity?", "1") gibt die eingegebene Zeichenkette zurück oder null bei „Abbrechen“. Die Eingabe von 12 ergibt "12", nicht 12. Diese Dialoge unterbrechen die Interaktion, solange sie geöffnet sind.

Setze "use strict"; an den Anfang eines klassischen Skripts, damit bestimmte Fehler gemeldet werden. Beispielsweise löst totl = 5; ohne Deklaration im strikten Modus einen ReferenceError aus; in einem klassischen Skript ohne strikten Modus kann dadurch versehentlich eine globale Variable entstehen. Ein Modul verwendet bereits den strikten Modus. Prüfe die Schreibweise und deklariere Namen, bevor du ihnen Werte zuweist.

Wichtige Erkenntnisse

  • Konsoleneingaben werten Ausdrücke aus und console.log() gibt Meldungen aus.
  • Das bei einer Deklaration angezeigte undefined ist vom gespeicherten Wert ihrer Variablen zu unterscheiden.
  • Namen unterscheiden Groß- und Kleinschreibung; Kommentare werden bei der Ausführung übersprungen.
  • prompt() gibt Text oder null zurück und confirm() einen booleschen Wert.
  • Der strikte Modus meldet Zuweisungen an nicht deklarierte Namen als Fehler.
2

Speichere Werte und bestimme, wo Namen gelten

Variablen geben Werten Namen, die der restliche Programmcode verwenden kann. Die Wahl von const oder let zeigt Lesern, ob einem Namen ein neuer Wert zugewiesen wird. Auch der Ort der Deklaration ist wichtig: Ein innerhalb eines Blocks erzeugter Wert ist außerhalb möglicherweise nicht verfügbar. Verfolge eine kleine laufende Summe und anschließend verschachtelte Blöcke, um zu sehen, auf welche Variable sich jeder Name bezieht und warum Deklarationsfehler unterschiedliche Fehlermeldungen erzeugen.

2.1 Deklariere Werte, weise sie zu und aktualisiere sie

Eine Variable ist ein Name, der auf einen Wert verweist. Du kannst den Namen zuerst deklarieren und ihm später einen Wert zuweisen oder beides in einer Anweisung tun. Der Zuweisungsoperator = speichert den Wert auf der rechten Seite unter dem Namen auf der linken Seite.

Wähle let oder const
let score;
console.log(score); // undefined
score = 10;
score = score + 2;
console.log(score); // 12

let score; deklariert die Variable. Bis eine Zuweisung ihr einen anderen Wert gibt, enthält sie undefined. Die nächste Zuweisung speichert 10. In score = score + 2; liest JavaScript den alten Punktestand, addiert 2 und speichert dann 12. Das ist eine Aktualisierungsanweisung und muss daher als mathematische Gleichung keinen Sinn ergeben. Die Neuzuweisung verwendet den vorhandenen Namen, ohne let erneut zu schreiben.

Eine const-Deklaration muss ihren Anfangswert enthalten:

const BOILING_POINT_C = 100;

Die Deklaration const rate; ist ein Syntaxfehler, weil ihr ein Initialisierer fehlt. Der Versuch, BOILING_POINT_C später einen neuen Wert zuzuweisen, löst einen TypeError aus.

DeklarationAnfangswert erforderlich?Kann dem Namen ein neuer Wert zugewiesen werden?
letNeinJa
constJaNein

Verwende standardmäßig const. Wähle let für eine laufende Summe, einen Zähler oder ein Ergebnis, das spätere Anweisungen zuweisen. Auch ein aus anderen Werten berechneter Wert kann const verwenden, wenn das Programm diesem Namen nie einen neuen Wert zuweist.

Gib dem Namen eine klare Bedeutung

Namen dürfen Buchstaben, Ziffern, _ und $ enthalten; sie dürfen nicht mit einer Ziffer beginnen. place1 ist zulässig, 1stPlace jedoch nicht. Leerzeichen sind verboten und ein Bindestrich wird als Subtraktion gelesen, sodass total-price nicht eine einzelne Variable bezeichnet. Reservierte Wörter wie if, return und class können keine Variablennamen sein.

Verwende camelCase für gewöhnliche Namen: itemCount, firstName oder priceWithTax. Namen für boolesche Werte wie isLoggedIn und hasDiscount beschreiben einen Ja-Nein-Wert. Nimm Einheiten in den Namen auf, wenn sie Verwechslungen verhindern: distanceKm und durationMin. Feste Werte, die vor der Ausführung des Programms bekannt sind, verwenden häufig UPPER_SNAKE_CASE, etwa MAX_LOGIN_ATTEMPTS. Die Groß- und Kleinschreibung ist wichtig: total und Total sind verschiedene Namen.

Gehe eine laufende Summe durch
const TAX_RATE = 0.2;
let total = 0;
total = total + 12.5;
total = total + 7.5;
const totalWithTax = total * (1 + TAX_RATE);
console.log(totalWithTax); // 24

Die Summe beginnt bei 0, wird zu 12.5 und dann zu 20. Der Faktor 1 + TAX_RATE ist 1.2, sodass der Endbetrag 24 beträgt. Nur total benötigt eine Neuzuweisung. Der Steuersatz und der berechnete Endbetrag verwenden const.

Schreibst du let total = 7.5; ein zweites Mal im selben Gültigkeitsbereich, versuchst du, eine zweite Variable zu deklarieren, statt die erste zu aktualisieren. Verwende total = 7.5;, um den Wert zu ersetzen.

Erkenne ältere Deklarationen

Älterer Code verwendet häufig var. Es funktioniert weiterhin, aber seine Variablen gehören zu einer Funktion oder einem Skript statt zu einem gewöhnlichen verschachtelten Block. Es erlaubt wiederholte Deklarationen und Lesezugriffe vor der Deklaration ergeben undefined. Die modernen Schlüsselwörter let und const erkennen diese Fehler. Behalte ihre Regeln im Kopf, wenn du eine ältere Anleitung liest, die var verwendet.

Wichtige Erkenntnisse

  • = berechnet die rechte Seite und speichert dann ihren Wert unter dem Namen auf der linken Seite.
  • Verwende standardmäßig const und let, wenn der Code dem Namen einen neuen Wert zuweist.
  • Eine const-Deklaration benötigt einen Anfangswert.
  • Weise einer vorhandenen Variablen einen neuen Wert zu, ohne ihr Deklarationsschlüsselwort zu wiederholen.
  • Aussagekräftige Namen in camelCase können Bedeutung und Einheiten zeigen.

2.2 Verfolge Gültigkeitsbereiche und erkenne Deklarationsfehler

Ein Block ist der Code zwischen geschweiften Klammern, etwa der Rumpf eines if. Der Gültigkeitsbereich einer Variablen ist der Bereich, in dem ihr Name auf diese Variable verweist. Sowohl let als auch const haben einen Blockgültigkeitsbereich, der alle im deklarierenden Block verschachtelten Blöcke einschließt.

Halte ein Ergebnis dort verfügbar, wo es gebraucht wird
const temperatureC = 31;
let label;
if (temperatureC > 30) {
  label = "hot";
} else {
  label = "mild";
}
console.log(label); // hot

label wird außerhalb der Ausführungszweige deklariert, sodass die letzte Zeile den Wert lesen kann. Jeder Zweig weist der vorhandenen Variablen einen Wert zu. Deklarierst du stattdessen const label = "hot"; innerhalb des ersten Zweigs, kann diese Variable nach dem Block nicht gelesen werden. Befindet sich kein anderes label im Gültigkeitsbereich, löst der letzte Lesezugriff einen ReferenceError aus.

Eine Deklaration auf oberster Ebene eines klassischen Skripts hat globalen Gültigkeitsbereich: Späterer Code in diesem Skript und die anderen klassischen Skripte der Seite können sie verwenden. In einem Modul gehören Variablen auf oberster Ebene zu diesem Modul. Belasse eine Variable im kleinsten Gültigkeitsbereich, der sie benötigt, um Namenskonflikte zu verringern.

Unterscheide Verdeckung von Neuzuweisung
let x = 1;
{
  let x = 2;
  console.log(x); // 2
}
console.log(x); // 1

Die innere Deklaration erzeugt eine eigene Variable. Das ist Verdeckung: Innerhalb des inneren Blocks verweist x auf die innere Variable. Die äußere Variable bleibt 1. Würdest du das innere let entfernen, würdest du stattdessen der äußeren Variablen 2 zuweisen. Unterschiedliche Namen machen diesen Unterschied leichter lesbar.

Lesen vor der Initialisierung

Eine Bindung mit Blockgültigkeitsbereich umfasst ihren ganzen Block, aber vor der Initialisierung durch die Deklaration kann nicht auf sie zugegriffen werden. Der Bereich vor der Initialisierung ist die zeitliche Totzone:

console.log(price);
let price = 5;

Das löst ReferenceError: Cannot access 'price' before initialization aus. Der Name existiert im Gültigkeitsbereich, ist aber noch nicht bereit. Dagegen bedeutet price is not defined, dass dort keine Bindung mit diesem Namen gefunden werden kann. Eine innere Deklaration verdeckt einen äußeren Namen auch schon vor der inneren Deklarationszeile; der äußere Wert kann die zeitliche Totzone der inneren Variablen nicht umgehen.

Ordne jedem Fehler eine Lösung zu
ProblemFehlertypLösung
const rate;SyntaxErrorEinen Anfangswert angeben
Ein zweites let total in einem GültigkeitsbereichSyntaxErrorOhne weiteres let zuweisen
Lesen vor der InitialisierungReferenceErrorVor dem Lesen initialisieren
Lesen eines unbekannten Namens oder eines Namens außerhalb des GültigkeitsbereichsReferenceErrorNamen korrigieren oder seine Deklaration verschieben
Neuzuweisung einer const-VariablenTypeErrorlet verwenden, wenn eine Neuzuweisung nötig ist

Syntaxfehler verhindern, dass das Skript startet. Ein Laufzeitfehler stoppt die aktuelle Ausführung, sobald sie die fehlerhafte Anweisung erreicht. Chrome erlaubt der Einfachheit halber eine weitere let-Deklaration in einer separaten Konsoleneingabe; dadurch werden doppelte Deklarationen in einem Skript nicht zulässig.

Const legt die Referenz fest

Primitive Werte wie Zahlen und Zeichenketten können nicht an Ort und Stelle verändert werden. Der Inhalt eines Objekts kann sich auch dann ändern, wenn sein Name const verwendet:

const settings = { theme: "dark" };
settings.theme = "light"; // allowed

Der Name verweist weiterhin auf dasselbe Objekt. Die Zuweisung settings = {}; versucht, diese Referenz zu ersetzen, und löst einen TypeError aus.

Wichtige Erkenntnisse

  • Namen mit let und const gelten innerhalb des Blocks, der sie enthält.
  • Deklariere ein gemeinsam genutztes Ergebnis vor den Zweigen, die ihm einen Wert zuweisen.
  • Verdeckung erzeugt eine eigene Variable; Neuzuweisung verändert die vorhandene.
  • Ein Lesezugriff in der zeitlichen Totzone schlägt fehl, obwohl die Bindung in diesem Gültigkeitsbereich existiert.
  • Doppelte Deklarationen sind Syntaxfehler, während die Neuzuweisung einer const-Variablen einen TypeError zur Laufzeit auslöst.
  • Der Inhalt eines const-Objekts kann geändert werden, ohne dem Namen einen neuen Wert zuzuweisen.
3

Rechne mit Werten und erstelle Text

Der Typ eines Werts hilft zu erklären, was eine Operation bewirkt. Zahlen ermöglichen Berechnungen, Zeichenketten enthalten Text und boolesche Werte enthalten true oder false. Lerne, diese Typen zu untersuchen, die Reihenfolge von Rechnungen zu steuern und die Ergebnisse von Zeichenkettenmethoden zu speichern. Mit Template-Literalen kannst du anschließend Werte zu lesbaren Meldungen verbinden. Genaue Konsolenausgaben zeigen, wo sich Text, Zahlen, Rundung und Formatierung unterschiedlich verhalten.

3.1 Bestimme den Typ eines Werts

Die Werte 7, "7" und true haben unterschiedliche Typen. Sie können an ähnlichen Stellen auf einer Seite erscheinen, aber JavaScript wendet auf jeden andere Regeln an. Ein Typ beschreibt den aktuell enthaltenen Wert und ist keine dauerhafte Einschränkung seiner Variablen.

Beginne mit den drei wichtigsten Typen

Ein number steht für ganze und dezimale Zahlenwerte: 42, -7 und 3.75 haben alle denselben Typ. Auch die wissenschaftliche Schreibweise ist numerisch: 1e3 bedeutet 1000. Ein string enthält Text in Anführungszeichen, sodass "42" Text ist, obwohl seine Zeichen Ziffern sind. Ein boolean ist entweder true oder false, ohne Anführungszeichen. Vergleiche erzeugen boolesche Werte, die ein Programm für Entscheidungen nutzen kann.

Untersuche einen Wert mit typeof. Der Operator gibt eine Zeichenkette mit dem Typnamen zurück:

console.log(typeof 7);         // number
console.log(typeof "7");       // string
console.log(typeof true);      // boolean
console.log(typeof undefined); // undefined

Die Kommentare zeigen die ausgegebenen Wörter; die Ergebnisse selbst sind Zeichenketten wie "number".

Erkenne fehlende Werte
let city;
let middleName = null;
console.log(city);       // undefined
console.log(middleName); // null

undefined bedeutet häufig, dass JavaScript kein Wert übergeben wurde, wie bei einem nicht initialisierten let. null wird üblicherweise bewusst zugewiesen und bedeutet „leer“ oder „kein Wert“. Prüfe mit middleName === null auf einen bewusst leeren Wert.

Verwende typeof value === "object" nicht als Prüfung auf null. typeof null ergibt aufgrund eines historisch bedingten Sprachverhaltens "object", obwohl null ein primitiver Wert ist.

Kenne die vollständige Liste der Typen

JavaScript hat sieben primitive Typen: number, string, boolean, undefined, null, bigint und symbol. Der achte Typ ist object und wird für strukturierte Werte verwendet. Funktionen sind Objekte, die aufgerufen werden können, obwohl typeof für sie "function" meldet.

Ein bigint ist eine ganze Zahl mit einem abschließenden n, etwa 9007199254740993n. Damit lassen sich große ganze Zahlen exakt darstellen. Mische bei Rechnungen keinen bigint mit einem number: 1n + 2 löst einen TypeError aus. Ein symbol ist ein eindeutiger Bezeichner; typeof Symbol("id") ergibt "symbol". typeof 42n ergibt "bigint".

NaN ist ein weiteres spezielles Ergebnis, das du erkennen solltest: Trotz seines Namens „keine Zahl“ ergibt typeof NaN den Wert "number". Es ist ein Zahlenwert, der ein ungültiges numerisches Ergebnis markiert. Sein Name allein bezeichnet keinen eigenen Typ.

Verfolge eine Variable, die sich ändert
let data = 42;
console.log(typeof data); // number
data = "forty-two";
console.log(typeof data); // string

Das ist dynamische Typisierung. Eine Neuzuweisung kann eine Zahl durch eine Zeichenkette ersetzen. Wegen dieser Flexibilität ist es bei einem überraschenden Ergebnis nützlich, sowohl den Wert als auch seinen Typ auszugeben:

const input = "7";
console.log(input, typeof input); // 7 string
console.log(input + 1);           // 71
console.log(7 + 1);               // 8

Die erste Addition verbindet Text; die zweite addiert Zahlen. Primitive Werte können nicht an Ort und Stelle verändert werden: Eine Operation erzeugt einen neuen Wert. Wird eine Variable aktualisiert, ändert sich, auf welchen Wert sie verweist.

Wichtige Erkenntnisse

  • Werte haben Typen; eine let-Variable kann nach einer Neuzuweisung Werte verschiedener Typen enthalten.
  • typeof gibt eine Zeichenkette mit dem Typnamen eines Werts zurück.
  • undefined bedeutet oft, dass kein Wert zugewiesen wurde; null bezeichnet üblicherweise ein bewusstes Fehlen.
  • typeof null ergibt "object" und typeof NaN ergibt "number".

3.2 Steuere Rechnungen und Zahlenwerte

JavaScript verwendet einen gewöhnlichen Zahlentyp für ganze und dezimale Werte. Bei der Division bleibt ein Nachkommateil erhalten: 10 / 4 ergibt 2.5. Sowohl der gewählte Operator als auch die Reihenfolge seiner Ausführung beeinflussen das Ergebnis.

Rechne in der beabsichtigten Reihenfolge
OperatorBedeutungBeispiel
+, -Addieren, subtrahieren8 - 3 ergibt 5
*, /Multiplizieren, dividieren7 / 2 ergibt 3.5
%Divisionsrest17 % 5 ergibt 2
**Potenz2 ** 3 ergibt 8

Potenzen werden vor Multiplikation, Division und Divisionsrest berechnet; diese wiederum vor Addition und Subtraktion. Operatoren gleicher Stufe werden von links nach rechts ausgeführt, Potenzen jedoch von rechts nach links zugeordnet: 2 ** 3 ** 2 ist 2 ** 9, also 512. Klammern ändern diese Reihenfolge: 2 + 3 * 4 ergibt 14, aber (2 + 3) * 4 ergibt 20.

Für den Mittelwert von 72, 85 und 90 addierst du die ganze Gruppe, bevor du dividierst:

const average = (72 + 85 + 90) / 3;
console.log(average); // 82.33333333333333

Ohne Klammern dividiert 72 + 85 + 90 / 3 nur die 90 und ergibt 187.

Trenne ganze Einheiten und Reste

Math.trunc(7 / 2) entfernt den Nachkommateil und ergibt 3. Bei einer positiven Länge von 245 cm ergibt Math.floor(245 / 100) den Wert 2 Meter und 245 % 100 die verbleibenden 45 Zentimeter. Ebenso ergeben 3.725 Sekunden mit Math.floor(3725 / 3600) den Wert 1 Stunde, mit Math.floor((3725 % 3600) / 60) den Wert 2 Minuten und mit 3725 % 60 den Wert 5 Sekunden. Für eine ganze Zahl prüft n % 2 === 0, ob sie gerade ist. Ein Divisionsrest hat das Vorzeichen des linken Operanden: -7 % 3 ergibt -1.

Aktualisiere eine Zahl

x += 5 bedeutet x = x + 5. Die Operatoren -=, *=, /=, %= und **= folgen demselben Muster. Ausgehend von 10 ergeben die Aktualisierungen += 5, *= 2, -= 4 und dann /= 2 die Werte 15, 30, 26 und schließlich 13.

++ erhöht um eins und -- verringert um eins. Bei let a = 5; let b = a++; wird a zu 6, aber b erhält 5: Das Postfix-Inkrement gibt den alten Wert zurück. Bei let b = ++a; werden beide zu 6, wenn du wieder mit a = 5 beginnst. Steht eine Aktualisierung in einer eigenen Zeile, musst du dich nicht auf das Ergebnis dieses Ausdrucks verlassen.

Runde und formatiere gezielt
FunktionRegel für das ErgebnisBeispiel
Math.round()Nächste ganze Zahl; Hälften in Richtung positiver UnendlichkeitMath.round(-2.5) ergibt -2
Math.floor()Abrunden in Richtung negativer UnendlichkeitMath.floor(-2.5) ergibt -3
Math.ceil()Aufrunden in Richtung positiver UnendlichkeitMath.ceil(2.1) ergibt 3
Math.trunc()Nachkommateil in Richtung null entfernenMath.trunc(-2.7) ergibt -2

Math.round(13.456 * 100) / 100 ergibt die Zahl 13.46. Dagegen ergibt (3.14159).toFixed(2) die Zeichenkette "3.14" und (19.999).toFixed(2) die Zeichenkette "20.00". Formatiere am Ende: Wird eine Zahl zu einer formatierten Zeichenkette addiert, wird Text verbunden.

Erkenne die Grenzen der Zahlendarstellung

Zahlen verwenden eine binäre 64-Bit-Gleitkommadarstellung. Die meisten Dezimalbrüche werden nur näherungsweise dargestellt, daher ergibt 0.1 + 0.2 den Wert 0.30000000000000004. Runde für die Anzeige, vergleiche mit einer geeigneten kleinen Toleranz oder rechne in ganzen Einheiten wie Cent oder Millimetern.

Einige ungültige Operationen geben einen Wert zurück, statt einen Fehler auszulösen: 5 / 0 ergibt Infinity, -5 / 0 ergibt -Infinity und 0 / 0 oder "abc" * 2 ergibt NaN. Die meisten Rechnungen mit NaN ergeben weiterhin NaN; NaN ** 0 ist eine Ausnahme und ergibt 1.

Jede ganze Zahl bis einschließlich Number.MAX_SAFE_INTEGER, also 9007199254740991, ist exakt. Darüber hinaus lassen sich nur manche ganzen Zahlen darstellen: 9007199254740992 + 1 ergibt weiterhin 9007199254740992. Bigints unterstützen größere exakte ganze Zahlen.

Wichtige Erkenntnisse

  • Klammern können dafür sorgen, dass eine ganze Summe durch eine Zahl dividiert wird.
  • % ergibt einen Divisionsrest; bei der Division allein bleibt der Nachkommateil erhalten.
  • Das Postfix-Inkrement gibt den alten Wert zurück; das Präfix-Inkrement den neuen.
  • Floor, ceil, round und trunc verhalten sich bei negativen Werten unterschiedlich.
  • toFixed() erzeugt Text für die Anzeige.
  • Rechnungen mit Dezimalzahlen können selbst bei einfach aussehenden Eingaben nur näherungsweise stimmen.
  • NaN und Unendlichkeiten sind spezielle Werte des Typs number.

3.3 Lies, durchsuche und verändere Text

Eine Zeichenkette speichert Text zwischen zusammenpassenden einfachen Anführungszeichen, doppelten Anführungszeichen oder Backticks. Bei einfachem Text können alle drei denselben Wert darstellen. Die Anführungszeichen markieren Anfang und Ende des Textes; sie sind kein Teil des Werts.

Anführungszeichen, Escape-Sequenzen und Verknüpfung

Verwende die andere Art von Anführungszeichen, um ein Anführungszeichen einzufügen: "It's late". Eine Maskierung verwendet einen umgekehrten Schrägstrich, wie in 'It\'s late'. \n steht für einen Zeilenumbruch, \t für einen Tabulator und \\ für einen umgekehrten Schrägstrich. Die Escape-Sequenz \n belegt eine Position in der Zeichenkette, obwohl sie mit zwei Zeichen geschrieben wird. "It's".length ergibt 4; "Line 1\nLine 2".length ergibt 13.

Der Operator + verknüpft Zeichenketten. "Hello" + " " + "world" ergibt "Hello world"; es wird kein Leerzeichen eingefügt, sofern keines der Teile eines enthält. Bei let msg = "Hi"; msg += " there"; ist der aktualisierte Wert "Hi there".

Positionen beginnen bei null
const language = "JavaScript";
console.log(language.length); // 10
console.log(language[0]);     // J
console.log(language[4]);     // S
console.log(language[9]);     // t
console.log(language.at(-1)); // t
console.log(language[10]);    // undefined

Der letzte Index ist length - 1. Ein negatives Argument für at() zählt vom Ende aus. length ist eine Eigenschaft, keine Methode: language.length() löst einen TypeError aus. Genauer gesagt verwenden Zeichenkettenpositionen und length UTF-16-Codeeinheiten, also die Einheiten, mit denen JavaScript Text speichert. Diese gewöhnlichen englischen Buchstaben belegen jeweils eine Einheit; manche Symbole und Emojis belegen mehr.

Speichere die neue Zeichenkette

Zeichenketten sind unveränderlich: Ihr Inhalt kann nicht an Ort und Stelle bearbeitet werden. Die Zuweisung word[0] = "b" erzeugt nicht "bat", wenn word den Wert "cat" hat; im strikten Modus löst sie einen Fehler aus. Methoden, die Text umwandeln, geben eine neue Zeichenkette zurück:

let name = "ana";
name.toUpperCase();
console.log(name); // ana
name = name.toUpperCase();
console.log(name); // ANA

Der Aufruf der Methode allein reicht nicht aus, um ihr Ergebnis zu behalten. Schreibst du name.toUpperCase ohne Klammern, wird sie überhaupt nicht aufgerufen.

Wähle die passende Textoperation

toLowerCase() und toUpperCase() ändern die Groß- beziehungsweise Kleinschreibung; trim() entfernt Leerraumzeichen an beiden Enden. Bei der Methodenverkettung wird jede Methode auf das vorherige Ergebnis angewendet: " Ana@Example.com ".trim().toLowerCase() ergibt "ana@example.com".

includes(), startsWith() und endsWith() geben boolesche Werte zurück. Zum Beispiel ergibt "report.pdf".endsWith(".pdf") den Wert true. indexOf() ergibt die Position des ersten Treffers oder -1: "JavaScript".indexOf("S") ergibt 4, die Suche nach "s" dagegen -1. Suchvorgänge unterscheiden Groß- und Kleinschreibung. "JavaScript".includes("script") ergibt false; wandle die Zeichenkette vor dieser Suche in Kleinbuchstaben um, um true zu erhalten.

slice(start, end) gibt Text vom Startindex bis ausschließlich zum Endindex zurück. "JavaScript".slice(0, 4) ergibt "Java"; .slice(4) und .slice(-6) ergeben "Script".

"a-b-c".replace("-", "+") ergibt "a+b-c"; replaceAll() mit denselben Argumenten ergibt "a+b+c". "ab".repeat(3) ergibt "ababab" und "5".padStart(3, "0") ergibt "005". Bei const city = "paris"; erzeugt city[0].toUpperCase() + city.slice(1) den Wert "Paris", indem ein großer Anfangsbuchstabe mit dem unveränderten Rest verbunden wird.

Wichtige Erkenntnisse

  • Zeichenketten benötigen zusammenpassende Anführungszeichen; die Konkatenation fügt nicht von selbst Leerzeichen hinzu.
  • Der erste Index ist null und der Index des letzten gewöhnlichen Buchstabens ist length - 1.
  • length ist eine Eigenschaft; Methoden werden mit Klammern aufgerufen.
  • Umwandelnde Methoden erzeugen neue Zeichenketten, speichere daher ihre Ergebnisse.
  • Suchvorgänge in Zeichenketten unterscheiden Groß- und Kleinschreibung.
  • slice() schließt seinen Endindex aus.

3.4 Füge Werte in lesbare Meldungen ein

Ein Template-Literal setzt Text zwischen Backticks. Darin markiert ${...} einen Platzhalter, dessen Ausdruck ausgewertet und in den Text eingefügt wird. Das ist nützlich, wenn eine Meldung mehrere Werte mit Satzzeichen, Leerzeichen oder Berechnungen verbindet.

Lies einen Platzhalter als Ausdruck
const name = "Ana";
const greeting = `Hello, ${name}!`;
console.log(greeting); // Hello, Ana!

Die Engine liest name, erhält "Ana" und setzt es zwischen die Begrüßung und das Ausrufezeichen. Die Backticks und Platzhalterzeichen beschreiben die Zeichenkette; sie erscheinen nicht in der fertigen Meldung.

Mit Konkatenation lautet dieselbe Idee "Hello, " + name + "!". Eine längere Meldung wie "Hello, " + name + "! You have " + count + " new messages." benötigt mehrere einzeln in Anführungszeichen gesetzte Teile. Ein Template hält den ganzen Satz zusammen: `Hello, ${name}! You have ${count} new messages.`. Leerzeichen musst du weiterhin dort eingeben, wo du sie haben möchtest.

Berechne und formatiere im Platzhalter
const name = "Ana";
const tickets = 3;
const price = 4.5;
const receipt = `${name} bought ${tickets} tickets for ${(tickets * price).toFixed(2)} in total.`;
console.log(receipt);

Die Ausgabe lautet „Ana bought 3 tickets for 13.50 in total.“ Zuerst erzeugt tickets * price den Wert 13.5. Die Klammern machen das ganze Produkt zum Empfänger von .toFixed(2), das "13.50" erzeugt. Der Platzhalter fügt diesen Text in den Satz ein. Die numerischen Variablen price und tickets bleiben unverändert.

Ohne Formatierung zeigt ein Platzhalter die gewöhnliche Textform der Zahl. `${0.1 + 0.2}` ergibt "0.30000000000000004". Die Formatierung darin, `${(0.1 + 0.2).toFixed(2)}`, ergibt "0.30".

Ausdrücke passen hinein, Anweisungen nicht

Ein Platzhalter kann einen Wert, eine Berechnung, einen Methodenaufruf oder einen Ausdruck enthalten, der einen Wert auswählt. Bei birthYear = 1990 ergibt `You turn ${2026 - birthYear} this year.` den Text „You turn 36 this year.“

Der bedingte Operator kann Text im Singular oder Plural auswählen:

const count = 1;
console.log(`You have ${count} ${count === 1 ? "item" : "items"}`);
// You have 1 item

Der Vergleich wählt eine Zeichenkette zum Einfügen aus. Eine if-Anweisung kann diesen Ausdruck innerhalb von ${...} nicht ersetzen, weil ein Platzhalter einen Ausdruck benötigt, der einen Wert erzeugt.

Beachte die genaue Zeichensetzung

Nur Backticks aktivieren Platzhalter. Bei const n = 5; ist "n + 1 = ${n + 1}" gewöhnlicher Text und lässt ${n + 1} unverändert. Das Template `n + 1 = ${n + 1}` ergibt „n + 1 = 6“. Ein Backtick ist ein anderes Zeichen als ein einfaches Anführungszeichen.

Innerhalb von Backticks eingegebene Zeilenumbrüche werden zu Zeilenumbrüchen in der resultierenden Zeichenkette. Auch Leerzeichen zur Einrückung werden Teil davon. Fehlende Werte werden als Text eingefügt: `${undefined}` ergibt "undefined", während `${null}` den Wert "null" ergibt. Enthält eine Meldung unerwartet „undefined“, untersuche die eingefügte Variable und die Stelle, an der ihr ein Wert zugewiesen wurde.

Wichtige Erkenntnisse

  • Backticks aktivieren ${...}-Platzhalter.
  • Ein Platzhalter wertet einen Ausdruck aus und fügt dessen Textform ein.
  • Formatiere eine berechnete Zahl innerhalb ihres Platzhalters, wenn die Meldung eine feste Anzahl von Nachkommastellen benötigt.
  • Zeichenketten in Anführungszeichen lassen Platzhalterzeichen unverändert.
  • Zeilenumbrüche und Einrückungen im Template werden Teil der Zeichenkette.
4

Wandle Eingaben um und sage automatische Änderungen voraus

Von Nutzern eingegebener Text muss oft in eine Zahl umgewandelt werden, bevor eine Berechnung funktionieren kann. JavaScript wandelt Werte auch selbstständig um, und seine Additionsregel kann eine beabsichtigte Summe in verbundenen Text verwandeln. Lerne, eine Umwandlung auszuwählen, auf fehlende oder ungültige Eingaben zu prüfen und einen Ausdruck in der Reihenfolge seiner Auswertung zu verfolgen. Dieselben Werte ergeben dann auch Sinn, wenn sie als Bedingungen statt als Zahlen verwendet werden.

4.1 Wandle Eingaben um, ohne ihre Bedeutung zu verlieren

Explizite Typumwandlung bedeutet, dass du die Umwandlung selbst schreibst und dazu etwa Number(), String() oder Boolean() verwendest. Sie macht den beabsichtigten Typ an der Stelle sichtbar, an der ein Wert in die Berechnung eingeht.

Wähle eine numerische Umwandlung

Number() liest den gesamten Text als Zahl und ignoriert umgebende Leerraumzeichen. Number("1.5") ergibt 1.5 und Number(" 12 ") ergibt 12. Number("12px") ergibt NaN, weil nicht die gesamte Zeichenkette numerisch ist. Code verwendet einen Dezimalpunkt: Auch Number("1,5") ergibt NaN.

parseInt() und parseFloat() lesen einen numerischen Anfang und stoppen, wenn der Text nicht mehr passt. parseInt("12px", 10) ergibt 12; parseFloat("3.75 kg") ergibt 3.75. Der Parser für ganze Zahlen stoppt am Dezimalpunkt, sodass parseInt("0.5", 10) den Wert 0 ergibt. parseInt("abc", 10) ergibt NaN, weil kein numerischer Anfang vorhanden ist. Übergib parseInt() eine Zahlenbasis: parseInt("08", 10) ergibt 8, während parseInt("ff", 16) hexadezimal liest und 255 ergibt.

Auch das unäre Plus wandelt gewöhnlichen numerischen Text um: +"42" ergibt 42.

Unterscheide fehlende Eingaben von null

Ein prompt-Dialog gibt eine Zeichenkette oder null zurück. „Abbrechen“ ergibt null, und das Bestätigen eines leeren Feldes ergibt "". Beide werden durch Number() zu null, ebenso Text, der nur aus Leerraumzeichen besteht. Prüfe vor der Umwandlung, ob eine Eingabe fehlt:

const input = prompt("Enter a quantity:");
if (input === null || input.trim() === "") {
  console.log("No quantity entered.");
} else {
  const quantity = Number(input);
  if (Number.isNaN(quantity)) {
    console.log("Please type a number.");
  } else {
    console.log(quantity + 1);
  }
}

Das || überspringt den Aufruf von trim(), wenn input den Wert null hat. Die Eingabe „12“ erreicht die numerische Berechnung und gibt 13 aus. Die Eingabe „12px“ führt zur Meldung über eine ungültige Zahl. Die Eingabe „0“ ist eine gültige Antwort und gibt 1 aus.

Verwende Number.isNaN(value), um auf einen tatsächlichen NaN-Wert zu prüfen. value === NaN ist nie wahr. Das ältere globale isNaN() wandelt sein Argument zuerst um: isNaN("hello") ergibt true, aber Number.isNaN("hello") ergibt false, weil dieser Wert weiterhin eine Zeichenkette ist.

Wandle in Text oder einen booleschen Wert um

String(42) ergibt "42", String(true) ergibt "true" und String(null) ergibt "null". Auch (42).toString() erzeugt "42", aber der Aufruf von .toString() auf null oder undefined löst einen TypeError aus. String() verarbeitet beide.

Boolean() gibt für false, 0, -0, 0n, "", null, undefined und NaN den Wert false zurück; dies sind Falsy-Werte. Browser haben außerdem das ältere Falsy-Objekt document.all. Andere Werte sind Truthy-Werte. Insbesondere sind "0", "false" und eine Zeichenkette mit einem einzelnen Leerzeichen allesamt Truthy-Werte. !!value führt dieselbe Umwandlung in einen booleschen Wert durch.

Bei den beiden Antworten "12" und "30" aus einem prompt-Dialog erzeugt a + b den Wert "1230". Wandle zuerst beide Eingaben um: Number(a) + Number(b) ergibt 42.

Wichtige Erkenntnisse

  • Number() erwartet, dass die gesamte Zeichenkette numerisch ist; Parser können ein numerisches Präfix lesen.
  • Prüfe vor der numerischen Umwandlung auf „Abbrechen“ und leere Eingaben, damit sie nicht zu null werden.
  • Verwende Number.isNaN(), um ein ungültiges numerisches Ergebnis zu erkennen.
  • Nicht leere Zeichenketten wie "false" sind Truthy-Werte.
  • String() kann null und undefined sicher umwandeln.

4.2 Sage implizite Typumwandlungen Operation für Operation voraus

Implizite Typumwandlung ist die automatische Umwandlung eines Typs innerhalb einer Operation. Ihre Regeln hängen vom Operator ab. Eine Berechnung, die zu funktionieren scheint, kann dennoch einen Textwert enthalten, der einen späteren Schritt scheitern lässt.

Verfolge die Additionsregel

Bei gewöhnlichen Operanden der Typen number, string, boolean, null und undefined verbindet + Text, wenn einer der Operanden eine Zeichenkette ist. Andernfalls führt der Operator eine numerische Umwandlung und Addition durch. "5" + 2 ergibt "52" und 2 + "5" ergibt "25".

Werte eine Kette von links nach rechts aus:

console.log(1 + 2 + "3"); // 33
console.log("3" + 1 + 2); // 312

Im ersten Ausdruck ergeben zwei addierte Zahlen 3; beim anschließenden Addieren von "3" werden die beiden Textformen zu "33" verbunden. Im zweiten Ausdruck erzeugt bereits die erste Operation "31", sodass die letzte Operation eine weitere Ziffer anhängt. Klammern können ändern, welche Operation zuerst ausgeführt wird: "3" + (1 + 2) ergibt "33".

Andere arithmetische Operatoren erwarten Zahlen

Subtraktion, Multiplikation, Division, Divisionsrest und Potenzen wandeln numerische Zeichenketten in Zahlen um. "5" - 2 ergibt 3, "5" * "2" ergibt 10 und "10" / "4" ergibt 2.5. Eine Zeichenkette wie "abc" kann nicht zu einer gültigen Zahl werden, sodass "abc" * 2 den Wert NaN ergibt. Für Bigints gelten eigene Rechenregeln; werden sie mit einem number gemischt, wird ein TypeError ausgelöst.

Dieser Unterschied kann einen Fehler verbergen:

const price = "20";
console.log(price * 3); // 60
console.log(price + 5); // 205

Die Multiplikation wandelt den Preis um, ändert aber die Variable nicht. Die spätere Addition trifft weiterhin auf eine Zeichenkette. Wandle Eingaben einmal dort um, wo sie ankommen, und arbeite dann mit dem numerischen Ergebnis weiter.

Verfolge kleine automatische Umwandlungen

Bei numerischen Rechnungen wird true zu 1, false zu 0 und null zu 0. So ergibt true + true den Wert 2, während null + 1 den Wert 1 ergibt. undefined wird zu NaN, sodass undefined + 1 den Wert NaN ergibt. Unäres Plus und Minus wandeln numerische Zeichenketten um: +"42" ergibt 42, -"5" ergibt -5 und +"" ergibt 0.

++ verlangt immer eine numerische Aktualisierung, aber += folgt der Additionsregel:

let count = "5";
count++;
console.log(count, typeof count); // 6 number
let label = "5";
label += 1;
console.log(label, typeof label); // 51 string
Bedingungen wenden eine andere Umwandlung an

Eine if-Bedingung beurteilt einen Wert als Truthy- oder Falsy-Wert. "0" ist eine nicht leere Zeichenkette und erfüllt die Bedingung; die Zahl 0 ist ein Falsy-Wert und der Block wird übersprungen. Ist null eine gültige Menge, kann eine Prüfung auf Truthy-Werte allein null nicht von einer fehlenden Antwort unterscheiden. Bei einem Wert, der durch eine Zahl oder null dargestellt wird, prüft quantity !== null ausdrücklich auf das Fehlen eines Werts.

Auch bei Gleichheit gibt es zwei Verhaltensweisen: "7" == 7 ergibt nach impliziter Typumwandlung true, aber "7" === 7 ergibt false, weil die strikte Gleichheit den Typunterschied beibehält. Verwende für gewöhnliche Vergleiche die strikte Gleichheit.

Ist ein Ergebnis verbundener Text oder NaN, gib jede Eingabe neben typeof input aus. Suche den ersten falschen Typ und korrigiere die Umwandlung dort. Würdest du "205" am Ende in eine Zahl umwandeln, ergäbe das 205, nicht die beabsichtigte Summe 25.

Wichtige Erkenntnisse

  • Bei gewöhnlichen primitiven Werten führt ein Zeichenkettenoperand dazu, dass + Zeichenketten verknüpft.
  • Verfolge +-Ketten von links nach rechts und beachte dabei die Klammern.
  • Andere arithmetische Operatoren wandeln numerische Zeichenketten um, ohne die ursprünglichen Variablen zu ändern.
  • ++ wandelt in eine Zahl um, während += Text anhängen kann.
  • Ob ein Wert ein Truthy-Wert ist, ist etwas anderes als seine Gültigkeit: null kann eine gültige Eingabe sein.
5

Vergleiche Werte und wähle einen Ausführungsweg

Entscheidungen machen aus Werten Aktionen: Ein Vergleich kann entscheiden, ob ein Messwert im Bereich liegt, eine Meldung fehlt oder eine feste Auswahl passt. Kombiniere Prüfungen sorgfältig und wähle damit einen Wert oder einen Codeblock. Die Reihenfolge der Ausführungszweige und die verglichenen Typen beeinflussen das Ergebnis. Verfolge jede Bedingung mit konkreten Eingaben, darunter null, eine leere Zeichenkette und ein Wert genau an einem Schwellenwert.

5.1 Vergleiche Werte ohne versteckte Annahmen

Ein Vergleich erzeugt einen booleschen Wert. 7 > 3 ergibt true, 5 >= 5 schließt Gleichheit ein und ergibt true, und 4 < 2 ergibt false. Speichere ein Ergebnis wie in const isAdult = age >= 18; oder verwende es direkt in einer Bedingung.

Bevorzuge strikte Gleichheit

=== vergleicht, ohne Typen umzuwandeln. Zwei gewöhnliche primitive Werte müssen denselben Typ und übereinstimmende Werte haben: 7 === 7 ergibt true, während "7" === 7 den Wert false ergibt. !== kehrt die strikte Gleichheit um, sodass "7" !== 7 den Wert true ergibt.

Lose Gleichheit, ==, kann Operanden umwandeln. "7" == 7, 0 == "" und "0" == false ergeben alle true. Ihre besondere Regel für fehlende Werte macht null == undefined wahr, aber null == 0 falsch. != kehrt die lose Gleichheit um. Bevorzuge === und !==; mit einem gezielten value == null kannst du sowohl auf null als auch auf undefined prüfen.

Unterscheide Textreihenfolge von Zahlenreihenfolge

Zwei Zeichenketten werden anhand ihrer UTF-16-Codewerte von links nach rechts verglichen. Für gewöhnliche englische Wörter in gleicher Groß- oder Kleinschreibung ergibt "apple" < "banana" den Wert true. Ein kürzerer übereinstimmender Anfang steht zuerst: "apple" < "apples" ergibt true. Bei den englischen Buchstaben ohne Akzent stehen Großbuchstaben vor Kleinbuchstaben, sodass "Zebra" < "apple" den Wert true ergibt. Wandelst du beide Zeichenketten mit toLowerCase() um, entfällt dieser Unterschied bei einfachen Vergleichen englischer Buchstaben.

Auch Ziffernzeichenketten folgen der Textreihenfolge:

console.log("10" < "9"); // true
console.log("10" < 9);   // false

Im ersten Vergleich steht das Zeichen „1“ vor „9“. Im zweiten ist ein Operand numerisch, sodass der Text zur Zahl 10 wird. Wandle numerische Eingaben gezielt um, bevor du ihre Größe vergleichst. "abc" < 5 und "abc" > 5 ergeben beide false, weil die numerische Umwandlung NaN erzeugt.

Behandle fehlende und ungültige Zahlen zuerst

NaN ist sich selbst nicht gleich: Sowohl NaN === NaN als auch NaN == NaN ergeben false. Verwende Number.isNaN(), um es zu erkennen.

Ordnungsvergleiche wandeln null in null um, sodass null >= 0 den Wert true, aber null > 0 den Wert false ergibt. Für Gleichheit gilt eine andere Regel, sodass null == 0 weiterhin false ergibt. undefined wird bei Ordnungsvergleichen zu NaN, sodass undefined > 0 und undefined < 0 falsch sind; auch undefined == 0 ist falsch. Prüfe auf einen fehlenden Wert, bevor du ihn als Messwert behandelst.

Vergleiche Dezimalzahlen und Bereiche

Durch binäre Rundung ist 0.1 + 0.2 === 0.3 falsch. Für diese kleinen Werte funktioniert eine Toleranzprüfung:

const closeEnough = Math.abs((0.1 + 0.2) - 0.3) < 0.000001;
console.log(closeEnough); // true

Math.abs() entfernt das Vorzeichen der Differenz. Wähle eine Toleranz, die zur Größe und Genauigkeit der Werte passt, oder rechne in ganzen Einheiten wie Millimetern.

Verkette Bereichsprüfungen nicht wie in der Mathematik. Bei x = 50 ergibt 0 < x < 10 zunächst true und vergleicht diesen booleschen Wert dann als 1 < 10, was true ergibt. Ebenso wird 3 > 2 > 1 zu true > 1, also 1 > 1, was falsch ist. Schreibe beide Vergleiche vollständig: x > 0 && x < 10.

Wichtige Erkenntnisse

  • Strikte Gleichheit prüft Typen ohne implizite Typumwandlung.
  • Zwei Ziffernzeichenketten werden als Text verglichen; wandle sie um, um ihre Zahlengröße zu vergleichen.
  • Prüfe vor numerischen Vergleichen auf fehlende Werte und NaN.
  • Dezimalergebnisse benötigen möglicherweise eine Toleranz statt eines exakten Gleichheitsvergleichs.
  • Verbinde zwei Bereichsvergleiche mit &&; verkette sie nicht.

5.2 Kombiniere Prüfungen und wähle Standardwerte

Mit logischen Operatoren kann eine Bedingung mehrere Anforderungen ausdrücken. Bei booleschen Operanden bedeutet && UND, || bedeutet ODER und ! bedeutet NICHT. Ihre Auswertungsreihenfolge ermöglicht außerdem, eine Operation abzusichern, die bei einem fehlenden Wert scheitern würde.

Drücke jede Anforderung aus
const temperatureC = 25;
const inRange = temperatureC >= 18 && temperatureC <= 30;
const outside = temperatureC < 18 || temperatureC > 30;

inRange ist wahr, weil beide Schranken eingehalten werden. outside ist falsch, weil keine der beiden Prüfungen auf Werte außerhalb des Bereichs erfüllt ist. ODER schließt den Fall ein, dass beide Seiten wahr sind; es bedeutet nicht „eine, aber niemals beide“.

Schreibe jeden Vergleich vollständig. color === "red" || "green" prüft nicht auf beide Farben. Bei color = "blue" ist der erste Vergleich falsch, aber die nicht leere Zeichenkette "green" ist ein Truthy-Wert. Die beabsichtigte Prüfung lautet color === "red" || color === "green".

Gruppiere die gemeinte Bedingung

NICHT bindet vor UND und UND vor ODER. Daher ist true || false && false wahr, aber (true || false) && false falsch.

Angenommen, der Zugriff setzt eine Anmeldung und entweder die Rolle als Administrator oder als Eigentümer voraus. Schreibe loggedIn && (isAdmin || isOwner). Ohne Klammern kann isOwner in loggedIn && isAdmin || isOwner den ganzen Ausdruck auch bei loggedIn = false wahr machen. Die Klammern sorgen dafür, dass die Anmeldung für beide Rollen erforderlich bleibt.

Das Umkehren einer zusammengesetzten Bedingung ändert auch die Verknüpfung. !(a && b) hat denselben Wahrheitswert wie !a || !b; !(a || b) entspricht !a && !b. Für eine Temperatur außerhalb des Intervalls einschließlich seiner Grenzen wird beim Umkehren der beiden Prüfungen auf Werte innerhalb des Intervalls >= zu <, <= zu > und UND zu ODER.

Stoppe, wenn das Ergebnis feststeht

UND stoppt beim ersten Falsy-Operanden; ODER stoppt beim ersten Truthy-Operanden. Das ist Kurzschlussauswertung. Der übersprungene Operand wird nicht ausgewertet:

const input = null;
const hasText = input !== null && input.trim() !== "";
console.log(hasText); // false

Die erste Prüfung ist falsch, sodass trim() nie auf null aufgerufen wird. Würdest du die beiden Prüfungen umkehren, würde zuerst die unsichere Operation versucht.

Diese Operatoren geben einen Operanden zurück, nicht unbedingt einen booleschen Wert. "" || "Guest" gibt "Guest" zurück; "Sam" || "Guest" gibt "Sam" zurück. "Ana" && "ok" gibt "ok" zurück und null && "x" gibt null zurück. Ein umgebendes if prüft anschließend, ob der zurückgegebene Wert ein Truthy-Wert ist.

Erhalte sinnvolle Falsy-Werte
AusdruckWann der Ersatzwert die Eingabe ersetzt
`value
value ?? fallbackNur bei null oder undefined

Bei quantity = 0 ergibt quantity || 1 den Wert 1, aber quantity ?? 1 erhält 0. Bei nickname = "" ergibt nickname || "Anonymous" den Ersatzwert, während nickname ?? "Anonymous" die leere Zeichenkette erhält. Verwende ??, wenn diese Werte sinnvoll sind.

Setze Klammern, wenn du ?? mit UND oder ODER mischst: a || b ?? c ist ein Syntaxfehler, während (a || b) ?? c eine ausdrückliche Gruppierung enthält. NICHT wandelt zuerst in einen booleschen Wert um und kehrt ihn dann um: !0 ist wahr und !"0" ist falsch. Doppeltes NICHT, !!value, ergibt einen reinen booleschen Wert.

Wichtige Erkenntnisse

  • UND benötigt beide Prüfungen; ODER benötigt mindestens eine.
  • Klammern sorgen dafür, dass gemeinsame Anforderungen für jeden erlaubten Fall gelten.
  • Die Kurzschlussauswertung überspringt einen Operanden, sobald das Ergebnis feststeht.
  • && und || geben Operandenwerte zurück, die keine booleschen Werte sein müssen.
  • ?? ersetzt nur null und undefined und erhält null und leeren Text.
  • Werden ?? und UND oder ODER direkt kombiniert, sind Klammern erforderlich.

5.3 Wähle Ausführungszweige, Werte und feste Fälle

Eine if-Anweisung führt einen Block aus, wenn ihre Bedingung ein Truthy-Wert ist. Ein else wird ausgeführt, wenn diese Bedingung ein Falsy-Wert ist. Verwende geschweifte Klammern, um genau zu zeigen, welche Anweisungen zu welchem Zweig gehören.

Ordne eine Kette von Entscheidungen

Eine else if-Kette prüft von oben nach unten. Die erste erfüllte Bedingung gewinnt und alle späteren Zweige werden übersprungen:

const score = 85;
let grade;
if (score >= 90) {
  grade = "A";
} else if (score >= 80) {
  grade = "B";
} else if (score >= 70) {
  grade = "C";
} else {
  grade = "F";
}

Der erste Vergleich ist nicht erfüllt; der zweite ist erfüllt, sodass grade zu "B" wird. Würde score >= 70 zuerst geprüft, würde sogar eine Punktzahl von 95 erfasst und "C" zugewiesen. Stelle bei überlappenden Mindestschwellen den höchsten Wert an den Anfang. Die gemeinsam genutzte Variable grade wird außerhalb der Zweige deklariert, damit späterer Code sie lesen kann.

Eine zusammengesetzte Bedingung kann eine kurze Entscheidung lesbar halten. Der Versand ist bei einem Bestellwert von mindestens 50 oder für ein Mitglied kostenlos; andernfalls kostet er 4,95:

const orderTotal = 45;
const isMember = false;
let shipping;
if (orderTotal >= 50 || isMember) {
  shipping = 0;
} else {
  shipping = 4.95;
}
console.log(`To pay: ${orderTotal + shipping}`);
// To pay: 49.95

Zwei verschachtelte Bedingungen ohne else-Zweige lassen sich oft mit UND verbinden: if (isLoggedIn) { if (isAdmin) { ... } } führt seinen innersten Code unter denselben booleschen Bedingungen aus wie if (isLoggedIn && isAdmin) { ... }.

Vermeide Satzzeichen, die den Ausführungsweg ändern

Ohne geschweifte Klammern gehört nur die nächste Anweisung zu einem if; durch Einrückung lässt sich keine weitere Anweisung hinzufügen. Ein Semikolon unmittelbar nach der Bedingung erzeugt eine leere Anweisung: Bei if (x > 5); { ... } wird der folgende Block unabhängig von der Bedingung ausgeführt.

if (x = 5) weist 5 zu und prüft dann, ob der Wert ein Truthy-Wert ist. Es ändert x und die Bedingung ist erfüllt, weil 5 ein Truthy-Wert ist. Verwende zum Vergleichen if (x === 5).

Wähle einen Wert mit einem bedingten Ausdruck

Der bedingte oder ternäre Operator gibt einen von zwei Werten zurück:

const age = 17;
const status = age >= 18 ? "adult" : "minor";
console.log(status); // minor

Die Form lautet condition ? valueIfTrue : valueIfFalse. Verwende sie für eine kurze Auswahl innerhalb einer Zuweisung oder eines Template-Literals. Verwende if/else für Zweige aus Anweisungen. Bei tief verschachtelten bedingten Ausdrücken sind die Auswahlmöglichkeiten schwer nachzuvollziehen.

Ordne feste Auswahlmöglichkeiten mit switch zu
const day = "Sat";
let kind;
switch (day) {
  case "Sat":
  case "Sun":
    kind = "weekend";
    break;
  default:
    kind = "weekday";
}

switch vergleicht den Wert strikt mit seinen case-Marken. Beide Wochenendmarken erreichen dieselbe Zuweisung. break beendet die switch-Anweisung; default behandelt einen Wert, zu dem kein Fall passt. switch ("2") passt nicht zu case 2:, weil sich die Typen unterscheiden.

Nach einem Treffer läuft die Ausführung durch spätere Fälle weiter, bis ein break oder das Ende erreicht wird. Dieses Fall-through kann wie bei aufeinanderfolgenden Marken beabsichtigt sein oder versehentlich auftreten. Fügt Fall 2 ein Wort hinzu und fehlt ein break, bevor Fall 3 ein weiteres hinzufügt, werden beide Hinzufügungen ausgeführt. Eine case-Marke ist ein Einstiegspunkt, keine neue Bedingung, die nach jeder Anweisung geprüft wird.

Wichtige Erkenntnisse

  • Eine else if-Kette führt nur ihren ersten Zweig mit erfüllter Bedingung aus.
  • Deklariere ein Ergebnis außerhalb der Zweige, wenn spätere Anweisungen es benötigen.
  • Verwende geschweifte Klammern und setze kein Semikolon direkt hinter eine if-Bedingung.
  • = weist einen Wert zu; === vergleicht Werte.
  • Der bedingte Operator wählt einen Wert aus.
  • switch vergleicht strikt und benötigt break, um das Fall-through zu stoppen.
6

Finde den ersten falschen Schritt

Eine Fehlermeldung kann direkt auf einen Fehler zeigen, aber ein Programm kann auch erfolgreich laufen und ein falsches Ergebnis liefern. Lies Typ, Meldung und Fundstelle in der Konsole und verfolge dann die relevanten Werte. Wenn Ausgaben zu viel Raum für Vermutungen lassen, halte die Ausführung an und gehe sie schrittweise durch. Eine kleine, wiederholbare Routine zur Fehlersuche hilft dir, eine Ursache nach der anderen zu prüfen und die Korrektur im gespeicherten Programm zu überprüfen.

6.1 Lies Fehler und verfolge falsche Ergebnisse

Ein Programm kann vor seinem Start scheitern, während der Ausführung stoppen oder mit einem falschen Ergebnis enden. Bestimme, was passiert ist, bevor du Code änderst. Die Konsole liefert Hinweise auf Fehler, während beschriftete Ausgaben Werte in Code sichtbar machen, der ausgeführt wird.

Unterscheide drei Arten von Problemen
ArtWas passiertBeispiel
SyntaxfehlerDas Skript kann nicht geparst werden; nichts davon wird ausgeführtEine nicht geschlossene Klammer
LaufzeitfehlerDie Ausführung erreicht eine Anweisung, die eine Ausnahme auslöst; frühere Anweisungen wurden ausgeführtLesen eines unbekannten Namens
Logischer FehlerDer Code läuft, aber das Ergebnis ist falschNur den letzten Teil einer Summe dividieren

Ein Syntaxfehler in einem Skript macht ein anderes, bereits ausgeführtes Skript nicht rückgängig. Eine unbehandelte Laufzeitausnahme stoppt die aktuelle Ausführung an der fehlerhaften Anweisung.

Lies die vollständige Meldung

Ein Konsoleneintrag wie Uncaught ReferenceError: totl is not defined nennt den Fehlertyp und den fehlerhaften Namen. „Uncaught“ bedeutet, dass die Ausnahme nicht behandelt wurde. Eine Fundstelle wie app.js:2 verweist auf Datei und Zeile; ein Klick darauf öffnet diesen Code.

let total = 0;
total = totl + 5;
console.log(total);

Zeile 1 wird ausgeführt. In Zeile 2 kann JavaScript totl nicht lesen, sodass es weder diese Zuweisung abschließt noch die letzte Ausgabe erreicht. Korrigierst du den Schreibfehler zu total, gibt das Skript 5 aus.

Häufige Syntaxmeldungen erwähnen eine fehlende ), ein unerwartetes Token oder ein ungültiges Token. In console.log("hi"; fehlt die schließende Klammer. In if (x > 3 { fehlt die schließende Klammer der Bedingung. Die gemeldete Zeile ist die Stelle, an der die Engine das Problem bemerkt hat; suche auch direkt darüber nach einem nicht geschlossenen Anführungs- oder Trennzeichen.

Grenze die Ursache anhand des Typs ein

Ein ReferenceError weist auf einen Namen hin, auf den nicht zugegriffen werden kann: einen Tippfehler, ein Problem mit dem Gültigkeitsbereich oder einen Lesezugriff vor der Initialisierung. Ein TypeError bedeutet, dass die Operation nicht zum Wert passt, etwa bei "abc".length(), null.trim() oder einer Neuzuweisung an eine const-Variable. Ein RangeError kann durch ein nicht unterstütztes Argument entstehen, etwa bei (1.5).toFixed(101).

Fehlermeldungen können je nach Browser unterschiedlich formuliert sein. Der Typ und der beteiligte Wert sind hilfreicher, als sich den ganzen Satz zu merken. Behebe den ersten relevanten Fehler und führe den Code erneut aus, denn spätere Meldungen können aus derselben Ursache folgen.

Verfolge einen logischen Fehler

Gib bei einem falschen Mittelwert die Summe und das Ergebnis getrennt aus:

const sum = 72 + 85 + 90;
const average = 72 + 85 + 90 / 3;
console.log("sum:", sum);         // 247
console.log("average:", average); // 187

Die korrekte Summe grenzt den Fehler auf den Divisionsschritt ein. Ändere die Berechnung zu sum / 3, was 82.33333333333333 ergibt. Wenn eine Addition unerwartet Ziffern verbindet, gib auch die Typen aus: console.log("price:", price, typeof price);. Suche den ersten Wert, der von deiner Erwartung abweicht.

Verwende console.warn() oder console.error(), um eigene Diagnosemeldungen hervorzuheben. Prüfe die Stufenfilter der Konsole, wenn eine Ausgabe zu fehlen scheint. Ein 404-Fehler bedeutet, dass eine Ressource nicht gefunden wurde; prüfe daher den Skriptpfad. Bei anderen Ladefehlern benötigst du die vollständige Meldung. Eine fehlende Startmeldung kann auch auf einen Filter oder einen Syntaxfehler zurückgehen.

Reproduziere das Problem, lies den ersten Fehler, prüfe eine wahrscheinliche Ursache mit einer kleinen Änderung oder Ausgabe und führe den Code dann erneut aus, um das erwartete Ergebnis zu prüfen. Entferne vorübergehende Ausgaben, wenn der Fehler behoben ist.

Wichtige Erkenntnisse

  • Für Syntax-, Laufzeit- und logische Fehler sind unterschiedliche Hinweise nötig.
  • Lies den Fehlertyp, die vollständige Meldung und die Fundstelle.
  • Die bei einem Syntaxfehler gemeldete Zeile kann hinter dem tatsächlich fehlenden Trennzeichen liegen.
  • Gib Werte und Typen aus, um den ersten falschen Schritt zu finden.
  • Prüfe Ladefehler und Konsolenfilter, wenn eine erwartete Ausgabe fehlt.

6.2 Halte die Ausführung an und untersuche aktuelle Werte

Mit einem Debugger kannst du ein laufendes Skript anhalten und die Werte genau in diesem Moment untersuchen. Verwende den Bereich „Sources“ in Chrome oder Edge oder den Bereich „Debugger“ in Firefox. Das ist besonders hilfreich, wenn ein falsches Ergebnis von mehreren vorherigen Operationen abhängt.

Halte vor der Ausführung einer Zeile an

Öffne das Skript in „Sources“ und klicke auf eine Zeilennummer, um einen Haltepunkt zu setzen. Die Ausführung hält an, bevor diese Zeile ausgeführt wird. Läuft der Code während des Ladens der Seite, lade die Seite nach dem Setzen des Haltepunkts neu. Das bloße Setzen führt bereits abgeschlossenen Code nicht erneut aus.

Du kannst auch debugger; in das Skript schreiben. Bei aktivem Debugger hält die Anweisung die Ausführung an; ohne Debugger hat sie keine Wirkung. Entferne diese Anweisung, bevor du den Code veröffentlichst.

Wähle die nächste Aktion
Steuerelement in ChromeTastenkombinationWirkung
FortsetzenF8Bis zum nächsten Haltepunkt oder zum Ende fortfahren
ProzedurschrittF10Die aktuelle Anweisung ausführen, ohne in eine aufgerufene Funktion einzutreten
EinzelschrittF11In eine aufgerufene Funktion eintreten, sofern sie dem Debugger zugänglich ist
HerausspringenShift+F11Die aktuelle Funktion beenden und in der aufrufenden Funktion anhalten

Bei manchen integrierten Aufrufen gibt es keinen JavaScript-Quellcode, den du schrittweise durchgehen kannst. Der Prozedurschritt ist nützlich, wenn du das Ergebnis eines Aufrufs erhalten möchtest, ohne dessen interne Arbeit zu verfolgen.

Während die Ausführung angehalten ist, kannst du mit der Maus über einen Namen fahren, um ihn zu untersuchen, lokale Werte in Scope lesen oder einen Ausdruck zu Watch hinzufügen. Überwachungsausdrücke wie typeof price und total > 100 werden nach jedem Schritt erneut ausgewertet. Auch die Konsole kann Ausdrücke im angehaltenen Gültigkeitsbereich auswerten.

Untersuche eine irreführende Summe

Kostenloser Versand soll ab 50 gelten, aber dieser Code gewährt ihn bei einer Zwischensumme von 45 zuzüglich 4 Versandkosten:

const subtotal = "45";
const shipping = 4;
const total = subtotal + shipping;
if (total >= 50) {
  console.log("Free shipping");
}

Setze einen Haltepunkt in der if-Zeile und lade die Seite neu. Die Zuweisung wurde bereits ausgeführt. „Scope“ zeigt subtotal als Zeichenkette "45" und total als "454". Der Überwachungsausdruck typeof total meldet "string". Der Vergleich wandelt "454" in eine Zahl um, sodass total >= 50 erfüllt ist.

Der Fehler liegt in der Addition vor dem Vergleich. Ändere die gespeicherte Berechnung zu const total = Number(subtotal) + shipping;. Lade erneut. Die Summe ist jetzt die Zahl 49 und die Bedingung ist falsch. Hältst du stattdessen bei der Zuweisung an, wurde diese noch nicht ausgeführt: Führe einen Prozedurschritt aus, bevor du das initialisierte total untersuchst.

Halte nur dort an, wo es nützlich ist

Ein bedingter Haltepunkt hält nur an, wenn sein Ausdruck wahr ist, etwa total > 100. Klicke mit der rechten Maustaste auf die Zeilennummer, um einen hinzuzufügen. Ein Protokollpunkt gibt bei jeder Ausführung seiner Zeile eine Meldung aus, ohne anzuhalten oder das Skript zu bearbeiten. Ausnahmehaltepunkte halten dort an, wo eine Ausnahme ausgelöst wird, sodass du die Werte beim Fehler untersuchen kannst.

Gehst du eine else if-Kette schrittweise durch, siehst du, welcher Zweig erreicht wird und welche frühere Bedingung spätere Prüfungen verhindert. Verwende Ausgaben für wenige bekannte Werte und den Debugger, wenn die Reihenfolge oder mehrere aktuelle Werte wichtig sind. Nimm die endgültige Korrektur im gespeicherten Projektcode vor: Eine experimentelle Änderung im Browser ist keine dauerhafte Änderung deines Projekts. Führe den ursprünglich fehlerhaften Fall erneut aus und prüfe das korrigierte Ergebnis.

Wichtige Erkenntnisse

  • Ein Zeilenhaltepunkt hält vor der Ausführung seiner Anweisung an; lade Code neu, der beim Seitenaufruf ausgeführt wird.
  • Der Prozedurschritt führt eine Anweisung aus; Einzelschritt und Herausspringen folgen Funktionsaufrufen.
  • Scope und Watch zeigen aktuelle Werte und Ausdrücke während der Unterbrechung.
  • Untersuche einen falschen Typ vor der Operation, die ihn verwendet.
  • Ein bedingter Haltepunkt filtert Unterbrechungen; ein Protokollpunkt gibt etwas aus, ohne anzuhalten.
  • Speichere die Korrektur im Projekt und führe den fehlerhaften Fall erneut aus.

Variablen und Datentypen in JavaScript: Beispiele

6 Interaktive Lektionen

1

Lade ein Skript und lies seine ersten Meldungen

13 Schritte
Binde ein kleines Skript in HTML ein, wähle sein Ladeverhalten und deute Ergebnisse aus Konsole und Dialogen.
  1. 1
    EinführungGib dem Code einen Ort zur Ausführung

    Ein Browser liest HTML, um die Seite aufzubauen, und führt JavaScript aus, um Anweisungen zu erledigen. Für ein erstes Ergebnis benötigst du ein eingebundenes Skript und eine geöffnete Konsole. Wir verfolgen eine kleine Seite von ihrer Dateianordnung bis zu ihrer ausgegebenen Meldung und unterscheiden anschließend anhand von Konsoleneingaben gespeicherte Werte von den Ergebnissen von Anweisungen.

  2. 2
    ErklärungWähle zwischen Inline-Code und externem Code

    Ein Inline-Skript enthält Code zwischen seinen Tags. Ein externes Skript lädt mit src eine separate JavaScript-Datei:

    <script src="js/greet.js"></script>
    

    Die externe Datei enthält JavaScript ohne HTML-Tags. Code innerhalb desselben Elements würde ignoriert, weil src vorhanden ist. Behalte das schließende </script>-Tag bei; HTML behandelt dieses Element nicht als selbstschließend.

  3. 3
    BeispielStimme den Pfad auf die Ordner ab

    Lege index.html neben einen Ordner namens js und greet.js in diesen Ordner. Das src="js/greet.js" der Seite beginnt beim HTML-Ordner und führt in js.

    Schreibe in die JavaScript-Datei:

    console.log("Page ready");
    

    Speichere beide Dateien. Der Pfad greet.js würde neben der HTML-Datei statt in ihrem Unterordner suchen und dieses Skript daher nicht finden.

  4. 4
    ErklärungFühre das Skript nach dem Parsen der Seite aus

    Ergänze defer beim externen klassischen Skript im head:

    <script src="js/greet.js" defer></script>
    

    Der Download erfolgt parallel zum Parsen des HTML. Die Ausführung wartet, bis das Parsen abgeschlossen ist. Mehrere verzögert ausgeführte klassische Skripte behalten ihre HTML-Reihenfolge bei. Das ist wichtig, wenn eines einen Wert verwendet, den ein anderes festgelegt hat. Ergänzt du defer bei klassischem Inline-Code, wird dessen Ausführung nicht verzögert.

  5. 5
    HerausforderungHalte abhängige Skripte in der richtigen Reihenfolge

    Eine Seite enthält setup.js gefolgt von display.js in ihrem head. Das zweite Skript verwendet einen Wert aus dem ersten und beide benötigen den geparsten Seiteninhalt. Würde async bei beiden diese Anforderungen erfüllen? Welche Lademethode würde das tun?

    ---reveal---

    Nein. async-Skripte werden jeweils ausgeführt, sobald ihr Download abgeschlossen ist; ihre Reihenfolge und die Bereitschaft der Seite sind daher nicht garantiert. Verwende defer bei beiden externen klassischen Skripten und belasse setup im HTML an erster Stelle.

  6. 6
    VerbindungErkenne ein Modulskript

    Ein mit type="module" geladenes Skript wird standardmäßig verzögert ausgeführt, verwendet den strikten Modus und behält seine Namen auf oberster Ebene innerhalb des Moduls. Module können über import und export Code austauschen. Lade Modulseiten in Chrome oder Firefox über einen lokalen Entwicklungsserver; beim direkten Öffnen einer Dateiadresse gelten Einschränkungen für das Laden von Modulen. Das sind andere Laderegeln als bei einem gewöhnlichen klassischen Skript.

  7. 7
    TippÖffne die Konsole für diese Seite

    Öffne die Konsole in Chrome oder Edge mit Ctrl+Shift+J unter Windows/Linux oder Cmd+Option+J auf dem Mac. Firefox verwendet Ctrl+Shift+K oder Cmd+Option+K. Lade die gespeicherte Seite neu und suche nach „Page ready“. Ein Fehler wegen einer fehlenden Datei verweist dich zurück zum Pfad; ein Syntaxfehler zeigt auf Code, den die Engine nicht parsen konnte. Konsoleneingaben gehören zur aktuellen Seite.

  8. 8
    BeispielUnterscheide Ausgabe und Auswertung

    Gib diese Anweisungen als separate Konsoleneingaben ein:

    let total = 9;
    total;
    console.log("Total:", total);
    

    Die Deklaration kann undefined als ihr Ergebnis anzeigen. Das Lesen von total ergibt dennoch 9. Der letzte Aufruf gibt „Total: 9“ aus und gibt selbst undefined zurück. Das angezeigte Ergebnis einer Anweisung ist nicht unbedingt der in der Variablen gespeicherte Wert oder die von diesem Aufruf ausgegebene Meldung.

  9. 9
    HerausforderungDeute eine Deklaration in der Konsole

    Du gibst let count = 6; ein und siehst undefined. Dann gibst du count + 2 ein. Welches Ergebnis erwartest du, und bedeutete die erste Anzeige, dass die Deklaration fehlgeschlagen ist?

    ---reveal---

    Das Ergebnis ist 8. Die Deklaration hat 6 erfolgreich gespeichert; ihr eigenes Ergebnis war undefined. Der spätere Ausdruck liest diese gespeicherte Zahl und addiert 2. Es findet keine Neuzuweisung statt, sodass count selbst weiterhin 6 enthält.

  10. 10
    ErklärungVerwende exakte Namen und klare Hinweise

    JavaScript unterscheidet Groß- und Kleinschreibung. console.log() funktioniert; Console.log() sucht nach einem anderen Namen. Verwende // für einen einzeiligen Kommentar oder /* ... */ für einen längeren. Die Engine überspringt den Kommentartext.

    Beginne ein klassisches Skript mit "use strict";, um Zuweisungen an nicht deklarierte Namen zu erkennen. Ein Tippfehler wie totl = 5; meldet dann einen Fehler, statt versehentlich einen globalen Namen zu erzeugen.

  11. 11
    BeispielUntersuche den Typ einer Dialogeingabe

    Führe diesen Code für einen Übungsdialog aus:

    const input = prompt("Quantity?", "1");
    console.log(input, typeof input);
    

    Bestätigst du eine eingegebene 6, ergibt das 6 string: Die Ziffern kamen als Text zurück. „Abbrechen“ gibt null zurück, während das Bestätigen eines leeren Feldes eine leere Zeichenkette zurückgibt. confirm() gibt dagegen einen booleschen Wert zurück und alert() zeigt eine Meldung. Ein Dialog wartet auf die Antwort, bevor die folgende Anweisung ausgeführt wird.

  12. 12
    HerausforderungVerbinde das Laden mit der Ausgabe

    Ein mit defer geladenes externes klassisches Skript enthält console.log("Started"); const answer = prompt("Code?"); console.log(typeof answer);. Der Nutzer gibt 42 ein und bestätigt. Was erscheint in welcher Reihenfolge, und würde das Neuladen diese Antwort automatisch erhalten?

    ---reveal---

    Die Meldungen lauten „Started“ und „string“. Prompt gibt Text zurück, auch bei Ziffern. Das Neuladen führt das gespeicherte Skript erneut aus und öffnet den prompt-Dialog wieder; die Variable der vorherigen Ausführung ist keine gespeicherte Projektänderung.

  13. 13
    ZusammenfassungPrüfe ein erstes Skript

    Prüfe bei einem ersten Skript den relativen Pfad, wähle das Ladeverhalten, speichere und lade neu. Unterscheide beim Lesen die Konsolenmeldung vom eigenen Auswertungsergebnis der Konsole. Liefert ein prompt-Dialog eine Eingabe, untersuche ihren Wert und Typ, bevor du darauf eine Berechnung aufbaust. Ein neues Konsolenexperiment verändert die laufende Seite; halte dauerhafte Änderungen daher im Projekt fest.

2

Verfolge Deklarationen, Aktualisierungen und Gültigkeitsbereiche

11 Schritte
Verfolge eine laufende Summe und sage dann voraus, wie innere Blöcke und Deklarationsfehler die Ausführung beeinflussen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVerfolge einen Wert durch ein Programm
  2. 2
    ErklärungWähle Deklarationen nach der Neuzuweisung
  3. 3
    BeispielLies den alten Wert, bevor du den neuen speicherst
  4. 4
    BeispielBerechne einen Endwert einmal
  5. 5
    HerausforderungWähle die passende Deklaration
  6. 6
    ErklärungSetze ein gemeinsames Ergebnis außerhalb seiner Zweige
  7. 7
    HerausforderungErkenne Verdeckung
  8. 8
    KernaussageEine Bindung kann existieren, bevor sie bereit ist
  9. 9
    TippNutze den Fehlertyp als Hinweis
  10. 10
    HerausforderungKorrigiere das Ergebnis, ohne es zu verbergen
  11. 11
    ZusammenfassungLies zuerst die Bindung, dann den Wert
3

Berechne eine Summe und erstelle ihre Meldung

18 Schritte
Untersuche Typen, berechne und formatiere Ergebnisse, wandle Zeichenketten um und erstelle eine Meldung mit einem Template.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungÜbertrage die Bedeutung von Werten in Text
  2. 2
    ErklärungUntersuche einen Wert, bevor du ihn verwendest
  3. 3
    HerausforderungSage einen Typwechsel voraus
  4. 4
    KernaussageInterpretiere einen Typnamen nicht zu weit
  5. 5
    BeispielRechne vor dem Formatieren
  6. 6
    ErklärungMache die ganze Summe zum Zähler
  7. 7
    HerausforderungErmittle die ganzen Meter
  8. 8
    TippWähle die Rundung nach ihrer Richtung
  9. 9
    VerbindungUnterscheide Rechengenauigkeit und Anzeige
  10. 10
    ErklärungBehalte das Ergebnis einer Umwandlung
  11. 11
    BeispielLies Indizes und einen Ausschnitt
  12. 12
    HerausforderungBereinige zuerst und prüfe dann
  13. 13
    KernaussageErkenne, ob eine Methode Text zurückgibt
  14. 14
    BeispielFüge die berechnete Summe ein
  15. 15
    HerausforderungWähle die benötigten Anführungszeichen
  16. 16
    ErklärungLass den Ausdruck ein Wort wählen
  17. 17
    HerausforderungKombiniere Bereinigung und Zahlendarstellung
  18. 18
    ZusammenfassungUntersuche eine Meldung von innen nach außen
4

Nimm eine Menge an, ohne fehlende Eingaben zu verbergen

12 Schritte
Verfolge eine Antwort aus einem prompt-Dialog durch Prüfungen auf fehlende Eingaben, Umwandlung, Validierung und Berechnung.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungUnterscheide das Fehlen einer Eingabe von einem Zahlenwert
  2. 2
    BeispielUntersuche die ungeprüfte Antwort
  3. 3
    ErklärungPrüfe vor der Umwandlung auf fehlende Eingaben
  4. 4
    BeispielWeise eine fehlgeschlagene Umwandlung zurück
  5. 5
    HerausforderungWähle einen Parser passend zur Bedeutung
  6. 6
    KernaussageWandle nach Truthy- und Falsy-Regeln um, ohne das Wort zu lesen
  7. 7
    BeispielErkenne eine Berechnung, die Text verbirgt
  8. 8
    ErklärungWerte eine Kette von links aus
  9. 9
    HerausforderungVerfolge zwei unterschiedliche Aktualisierungen
  10. 10
    TippKorrigiere die Eingabe vor der Summenbildung
  11. 11
    HerausforderungErhalte die null auf dem gesamten Weg
  12. 12
    ZusammenfassungValidiere in der Reihenfolge, in der Informationen vorliegen
5

Erstelle eine Entscheidung, die ihren Regeln entspricht

15 Schritte
Vergleiche Werte, kombiniere Anforderungen, erhalte null bei Standardwerten und verfolge Ausführungszweige und switch-Fälle.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungWandle eine Regel in eine vorhersagbare Entscheidung um
  2. 2
    ErklärungHalte Typen beim Gleichheitsvergleich sichtbar
  3. 3
    BeispielVergleiche als Text gespeicherte Zahlen
  4. 4
    HerausforderungBestimme die tatsächlichen Operanden eines Vergleichs
  5. 5
    TippPrüfe fehlende Werte und numerische Genauigkeit
  6. 6
    ErklärungFormuliere jede Anforderung ausdrücklich
  7. 7
    BeispielGruppiere eine gemeinsame Anforderung
  8. 8
    HerausforderungErhalte einen leeren Wert, wenn er gültig ist
  9. 9
    KernaussageDie Kurzschlussauswertung steuert, was ausgewertet wird
  10. 10
    BeispielVerfolge den ersten erfüllten Ausführungszweig
  11. 11
    HerausforderungWähle einen Wert oder mehrere Anweisungen
  12. 12
    ErklärungVerstehe switch als Einstiegspunkt
  13. 13
    HerausforderungSage die Wirkung des fehlenden break voraus
  14. 14
    HerausforderungKombiniere Umwandlung und Reihenfolge der Zweige
  15. 15
    ZusammenfassungPrüfe die Regel an ihren Grenzen
6

Finde und korrigiere eine irreführende Summe

12 Schritte
Nutze Hinweise aus der Konsole und einen angehaltenen Debugger-Zustand, um einen Typfehler in einer ansonsten laufenden Berechnung zu finden.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungFinde die Stelle, an der das Ergebnis zuerst falsch wird
  2. 2
    ErklärungOrdne den Fehler ein, bevor du Code änderst
  3. 3
    BeispielLies den fehlerhaften Namen und seine Fundstelle
  4. 4
    HerausforderungUnterscheide Parsen und Ausführung
  5. 5
    TippGib den ersten unerwarteten Wert aus
  6. 6
    BeispielReproduziere die falsche Entscheidung
  7. 7
    ErklärungHalte vor dem Vergleich an
  8. 8
    KernaussageDie spätere Umwandlung kann die Addition nicht korrigieren
  9. 9
    HerausforderungUntersuche Werte vor und nach einer Zuweisung
  10. 10
    TippWähle die Unterbrechung, die die Frage beantwortet
  11. 11
    HerausforderungPrüfe eine Typkorrektur anhand einer Entscheidung
  12. 12
    ZusammenfassungTeste die gespeicherte Korrektur erneut

Variablen und Datentypen in JavaScript: Übungsaufgaben

60 Übungsfragen in 6 Sets

Set 1: Führe Code aus und verfolge gespeicherte Werte10 Übungsfragen

Frage 1 von 10

Eine HTML-Seite liegt neben einem Ordner scripts, der start.js enthält. Welches Element lädt diese Datei nach Abschluss des HTML-Parsens?
  1. <script src="start.js" defer></script>
  2. <script src="scripts/start.js" defer></script>
  3. <script src="scripts/start.js" async></script>
  4. <script defer>scripts/start.js</script>
Antwort zeigenAntwort ausblenden
Antwort: B
Der relative Pfad muss den Ordner scripts enthalten und defer verzögert die Ausführung des externen klassischen Skripts, bis das Parsen abgeschlossen ist. Auch async lädt parallel zum Parsen herunter, kann das Skript aber ausführen, bevor das Parsen abgeschlossen ist. Wird der Pfad als Inline-Text geschrieben, lädt das keine Datei.

Frage 2 von 10

Welche Meldung gibt dieser Code aus?

// console.log("Old");
console.log("Items:", 6 + 2);
  1. „Old Items: 8“
  2. „Items: 62“
  3. „Items: 6 + 2“
  4. „Items: 8“
Antwort zeigenAntwort ausblenden
Antwort: D
Die auskommentierte Zeile wird übersprungen und der numerische Ausdruck wird ausgewertet, bevor sein Ergebnis ausgegeben wird. console.log() trennt die Beschriftung und das Ergebnis durch ein Leerzeichen und erzeugt „Items: 8“. Für das Verbinden der Ziffern zu „62“ wäre eine Zeichenkettenverknüpfung nötig, aber beide Operanden sind hier Zahlen.

Frage 3 von 10

Ein Programm speichert const rate = 0.15; und führt anschließend rate = 0.2; aus. Was passiert bei der Zuweisung?
  1. Sie löst einen TypeError aus.
  2. Sie setzt den Satz auf 0,2.
  3. Sie löst einen SyntaxError aus.
  4. Sie belässt rate als undefined.
Antwort zeigenAntwort ausblenden
Antwort: A
Die Deklaration liefert einen gültigen Anfangswert, sodass das Skript starten kann. Der spätere Versuch, der const-Bindung einen neuen Wert zuzuweisen, löst einen TypeError aus, sobald die Ausführung ihn erreicht. Ein fehlender Initialisierer würde dagegen die Deklaration selbst zu einem Syntaxfehler machen.

Frage 4 von 10

Welcher Wert wird ausgegeben?

let balance = 14;
balance = balance + 9;
balance = balance - 4;
console.log(balance);
  1. 23
  2. 10
  3. 19
  4. 14
Antwort zeigenAntwort ausblenden
Antwort: C
Jede Zuweisung liest den aktuellen Kontostand, berechnet die rechte Seite und speichert dann den neuen Wert. Der Kontostand wird zu 23 und dann zu 19, sodass die letzte Ausgabe 19 zeigt. Bei 23 würdest du die zweite Aktualisierung übersehen; der ursprüngliche Wert 14 wird zwischen den Anweisungen nicht wiederhergestellt.

Frage 5 von 10

Welche Werte werden in welcher Reihenfolge ausgegeben?

let level = 4;
{
  let level = 9;
  console.log(level);
}
console.log(level);
  1. 9, dann 9
  2. 4, dann 9
  3. 9, dann 4
  4. 4, dann 4
Antwort zeigenAntwort ausblenden
Antwort: C
Die innere Deklaration erzeugt eine eigene Variable mit Blockgültigkeitsbereich, die den ersten ausgegebenen Wert liefert. Nach dem Verlassen des Blocks ist die unveränderte äußere Variable wieder sichtbar, sodass der zweite Wert 4 ist. Nur wenn die innere Anweisung der äußeren Variablen einen neuen Wert zuweisen würde, statt eine neue zu deklarieren, wäre das Ergebnis zweimal 9.

Frage 6 von 10

Welche Zeichenkette gibt typeof "28" zurück?
  1. "number"
  2. "string"
  3. "object"
  4. "undefined"
Antwort zeigenAntwort ausblenden
Antwort: B
Die Anführungszeichen machen "28" zu einer Zeichenkette, obwohl ihre Zeichen Ziffern sind. typeof meldet den aktuellen Typ des Werts und wandelt den Text nicht in eine Zahl um. Das Ergebnis "number" würde den Wert 28 ohne Anführungszeichen beschreiben, nicht den hier angegebenen Wert.

Frage 7 von 10

Eine gemessene Länge beträgt 386 cm. Welches Ausdruckspaar ergibt ihre ganzen Meter und die verbleibenden Zentimeter?
  1. Math.floor(386 / 100) und 386 % 100
  2. 386 / 100 und 386 % 100
  3. Math.round(386 / 100) und 386 % 100
  4. Math.floor(386 / 100) und 386 / 100
Antwort zeigenAntwort ausblenden
Antwort: A
Das Abrunden des positiven Quotienten ergibt 3 ganze Meter und der Divisionsrest die verbleibenden 86 Zentimeter. Die einfache Division ergibt 3,86 und damit keine Anzahl ganzer Meter. Das Runden des Quotienten ergibt 4 und damit mehr ganze Meter, als die Länge enthält.

Frage 8 von 10

Was gibt "catalog".slice(1, 4) zurück?
  1. "atal"
  2. "cat"
  3. "tal"
  4. "ata"
Antwort zeigenAntwort ausblenden
Antwort: D
Zeichenkettenpositionen beginnen bei null, sodass Index 1 das erste „a“ ist. slice(1, 4) kopiert die Positionen 1, 2 und 3 und schließt Position 4 aus; das ergibt "ata". Würde die Endposition einbezogen, käme fälschlich der nächste Buchstabe hinzu und es entstünde "atal".

Frage 9 von 10

Ein Skript gibt eine Startmeldung aus und stoppt dann mit ReferenceError: lenght is not defined. Was solltest du zuerst untersuchen?
  1. Den HTML-Pfad des geladenen Skripts.
  2. Die Schreibweise und den Gültigkeitsbereich von lenght.
  3. Die Dezimalgenauigkeit seiner Werte.
  4. Die Farbeinstellungen für Warnungen in der Konsole.
Antwort zeigenAntwort ausblenden
Antwort: B
Die Startmeldung zeigt, dass die Ausführung dieses Skripts begonnen hat, und der Fehler nennt einen Namen, der nicht gelesen werden kann. Prüfe, ob lenght falsch geschrieben oder im aktuellen Gültigkeitsbereich nicht verfügbar ist. Ein falscher Skriptpfad würde die Ausführung der Startanweisung dieser Datei verhindern, was nicht zur Beobachtung passt.

Frage 10 von 10

Angenommen, es gibt keine frühere Deklaration von cost. Was wird ausgegeben, bevor dieses Skript stoppt?

let cost = 8;
{
  console.log(cost);
  let cost = 12;
}
console.log(cost);
  1. Nichts; die erste Ausgabe trifft auf eine zeitliche Totzone.
  2. 8; dann schlägt die innere Deklaration fehl.
  3. 12; dann gibt die äußere Ausgabe 8 aus.
  4. undefined; dann gibt die äußere Ausgabe 8 aus.
Antwort zeigenAntwort ausblenden
Antwort: A
Die innere Bindung von cost umfasst den ganzen Block und verdeckt die äußere auch oberhalb ihrer Deklaration. Die erste Ausgabe liest daher eine nicht initialisierte innere Bindung und löst vor der Ausgabe einen ReferenceError aus. Sie kann weder auf die äußere 8 zurückgreifen noch die innere Bindung als undefined lesen.
Set 2: Erstelle Text und wandle Eingaben um10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was gibt "notes.txt".endsWith(".txt") zurück?
  1. "txt"
  2. 5
  3. true
  4. "true"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Was wird ausgegeben?

let tag = " mixed ";
tag.trim().toUpperCase();
console.log(tag.length);
  1. 7
  2. 5
  3. 6
  4. 0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Gegeben ist const trays = 4; const massKg = 1.25;. Was erzeugt `Mass: ${(trays * massKg).toFixed(1)} kg`?
  1. "Mass: 5 kg"
  2. "Mass: 41.25 kg"
  3. "Mass: 5.00 kg"
  4. "Mass: 5.0 kg"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welchen Text speichert bei const name = "Mira"; die Anweisung const label = "Hello, ${name}";?
  1. "Hello, Mira"
  2. "Hello, ${name}"
  3. "Hello, undefined"
  4. "Hello, name"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welchen Wert erzeugt Number("18px")?
  1. NaN
  2. 18
  3. 0
  4. "18"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein prompt-Dialog für eine Menge wird abgebrochen. Der Code berechnet sofort Number(input). Welcher Wert entsteht und welche Information geht verloren?
  1. NaN; „Abbrechen“ ist nicht mehr von ungültigem Text zu unterscheiden.
  2. null; „Abbrechen“ bleibt von einer eingegebenen null unterscheidbar.
  3. "0"; „Abbrechen“ ist nicht mehr von numerischem Text zu unterscheiden.
  4. 0; „Abbrechen“ ist nicht mehr von einer eingegebenen null zu unterscheiden.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welcher Wert und welcher Typ entstehen aus 6 + 2 + "4"?
  1. 12, Zahl
  2. "624", Zeichenkette
  3. "84", Zeichenkette
  4. 84, Zahl
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was erzeugt shown + 1 nach const shown = (7.5).toFixed(2);?
  1. 8.5
  2. "7.501"
  3. "8.50"
  4. "7.51"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Eingabe ist entweder eine Zeichenkette oder null. Eine Menge muss vorhanden, nicht negativ und numerisch sein; null ist erlaubt. Welche Validierungsfolge erfüllt alle Anforderungen?
  1. Mit Number umwandeln; Falsy-Zahlen zurückweisen; den Rest akzeptieren.
  2. null zurückweisen; parseFloat verwenden; NaN oder Werte unter 0 zurückweisen.
  3. null und leere Eingaben zurückweisen; mit Number umwandeln; Werte unter 0 zurückweisen.
  4. null und leere Eingaben zurückweisen; mit Number umwandeln; NaN oder Werte unter 0 zurückweisen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Welcher Wert und welcher Typ werden ausgegeben?

let amount = "6";
amount += 2;
amount++;
amount -= 4;
console.log(amount, typeof amount);
  1. 58, Zahl
  2. 5, Zahl
  3. 59, Zahl
  4. "59", Zeichenkette
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Prüfe Vergleiche und wähle Ausführungszweige10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was ist das Ergebnis von "16" === 16?
  1. true
  2. "false"
  3. NaN
  4. false
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Sensor speichert seine Messwerte als Zeichenketten. Warum ergibt "24" < "8" den Wert true?
  1. Beide Zeichenketten werden vor dem Vergleich in Zahlen umgewandelt.
  2. Die ersten unterschiedlichen Textzeichen sind „2“ und „8“.
  3. Der Vergleich prüft den Zahlenwert der kürzeren Zeichenkette.
  4. Der Kleiner-als-Operator kehrt bei Zeichenketten die Zahlenreihenfolge um.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Zu welchem Wert wird 0 ?? 5 ausgewertet?
  1. 0
  2. 5
  3. false
  4. null
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Messwert muss mindestens 12 und höchstens 28 betragen. Welche Bedingung prüft diesen Bereich einschließlich seiner Grenzen?
  1. reading > 12 && reading < 28
  2. reading >= 12 || reading <= 28
  3. reading >= 12 && reading <= 28
  4. 12 <= reading <= 28
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was wird ausgegeben?

const points = 76;
let badge;
if (points >= 60) {
  badge = "bronze";
} else if (points >= 75) {
  badge = "silver";
} else {
  badge = "none";
}
console.log(badge);
  1. „silver“
  2. „bronze“
  3. „none“
  4. „bronze silver“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was erzeugt active ? "Ready" : "Waiting" bei const active = false;?
  1. "Ready"
  2. false
  3. undefined
  4. "Waiting"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welcher Wert wird ausgegeben?

const mode = "2";
let label = "idle";
switch (mode) {
  case 2:
    label = "fast";
    break;
  default:
    label = "normal";
}
console.log(label);
  1. „normal“
  2. „fast“
  3. „idle“
  4. „fast normal“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Die Veröffentlichung benötigt eine Freigabe und entweder eine Redakteurs- oder eine Eigentümerrolle. Bei approved = false, isEditor = false und isOwner = true verwendet der Code approved && isEditor || isOwner. Welches Ergebnis liefert er und welche Bedingung setzt die vollständige Regel durch?
  1. false; verwende approved && (isEditor || isOwner)
  2. true; verwende approved || (isEditor && isOwner)
  3. true; verwende approved && (isEditor || isOwner)
  4. false; verwende approved || (isEditor && isOwner)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welcher Text wird ausgegeben?

let route = "";
switch (3) {
  case 2:
    route += "A";
    break;
  case 3:
    route += "B";
  case 4:
    route += "C";
    break;
  default:
    route += "D";
}
console.log(route);
  1. „B“
  2. „BCD“
  3. „BC“
  4. „ABC“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Welche Werte ergeben bei const distance = 42; die Ausdrücke 0 < distance < 20 und distance > 0 && distance < 20 jeweils?
  1. false und false
  2. true und false
  3. true und true
  4. false und true
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Verfolge Fehler und untersuche die Ausführung10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Skript berechnet den Flächeninhalt eines Rechtecks, indem es dessen beide Seitenlängen addiert. Es läuft und gibt ohne Fehlermeldung den falschen Flächeninhalt aus. Um welche Art von Fehler handelt es sich?
  1. Ein logischer Fehler.
  2. Ein Syntaxfehler.
  3. Ein ReferenceError.
  4. Ein Ladefehler.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Die Ausführung hält bei total = total + 7; an, während total den Wert 11 hat. Welcher Wert erscheint vor dem Prozedurschritt und welcher danach?
  1. 18 vorher; 25 danach.
  2. 11 vorher; 11 danach.
  3. 11 vorher; 18 danach.
  4. undefined vorher; 18 danach.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Du möchtest jedes Mal, wenn eine Zeile erreicht wird, eine Diagnosemeldung erhalten, ohne anzuhalten oder das Skript zu bearbeiten. Welche Debugger-Funktion passt?
  1. Ein Zeilenhaltepunkt.
  2. Ein bedingter Haltepunkt.
  3. Ein Ausnahmehaltepunkt.
  4. Ein Protokollpunkt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Konsolenausgabe am Anfang eines Skripts fehlt und die Konsole zeigt für die URL dieses Skripts einen 404-Fehler. Was solltest du zuerst prüfen?
  1. Den Typ der zuletzt berechneten Summe des Skripts.
  2. Den Skriptpfad und ob die Datei dort existiert.
  3. Die Reihenfolge der Bedingungen im geladenen Skript.
  4. Den Gültigkeitsbereich von Variablen nach seiner letzten Anweisung.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was passiert, wenn dieses Skript geladen wird?

console.log("Begin");
let size = 4;
let size = 7;
  1. Es gibt „Begin“ aus und stoppt dann mit einem TypeError.
  2. Ein SyntaxError verhindert die Ausführung aller Zeilen dieses Skripts.
  3. Es gibt „Begin“ aus und ändert dann size zu 7.
  4. Es gibt „Begin“ aus und stoppt dann mit einem ReferenceError.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Summe ist falsch. Ausgaben zeigen base: 13 number, extra: 4 string und total: 134 string. Wo sollte die Korrektur beginnen?
  1. Die verbundene Summe nach der Addition umwandeln.
  2. Die verbundene Summe mit zwei Nachkommastellen formatieren.
  3. Die neben der Summe ausgegebene Beschriftung ändern.
  4. Die zusätzliche Eingabe vor der Addition umwandeln.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein angehaltenes Programm zeigt unmittelbar vor if (total > 100) die Werte raw = "27", fee = 6 und total = "276". Welche Änderung behebt die falsche Einstufung als hohe Summe?
  1. Bei der Berechnung der Summe Number(raw) + fee verwenden.
  2. In der Bedingung Number(total) > 100 verwenden.
  3. In der Bedingung total >= 100 verwenden.
  4. In der Bedingung total === "276" verwenden.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein beim Laden ausgeführtes Skript gibt ein falsches Ergebnis aus. Du setzt nach dem vollständigen Laden der Seite einen Haltepunkt auf seine Berechnung, aber es hält nie an. Wie kannst du die Berechnung und das zugewiesene Ergebnis untersuchen?
  1. Das abgeschlossene Skript fortsetzen und dann das alte Ergebnis der Zuweisung untersuchen.
  2. Mit einem Einzelschritt in die fertige Seite eintreten und dann ihren ursprünglichen Quelltext untersuchen.
  3. Neu laden, um den Haltepunkt zu erreichen, und dann die Zuweisung mit einem Prozedurschritt ausführen.
  4. Den Haltepunkt hinter das Skript verschieben und dann warten, bis es sich selbst erneut ausführt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welche Meldungen werden ausgegeben, bevor dieser Code stoppt?

console.log("One");
let current = 5;
current += unknownStep;
console.log("Two");

Angenommen, unknownStep wurde nicht deklariert.

  1. Keine Meldung; die Aktualisierung verursacht einen SyntaxError.
  2. Beide Meldungen; der fehlende Wert wird zu NaN.
  3. Nur „Two“; die frühere Ausgabe wird rückgängig gemacht.
  4. Nur „One“; die Aktualisierung löst einen ReferenceError aus.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Angenommen, jede Eingabe wird in einem neuen Durchlauf verarbeitet. Was passiert bei null und bei " 5 "?

const cleaned = input.trim() !== "" && input !== null;
const total = cleaned ? Number(input) + 2 : 0;
console.log(total);
  1. Null löst einen TypeError aus; Text gibt 7 aus.
  2. Null gibt 0 aus; Text gibt 7 aus.
  3. Null löst einen TypeError aus; Text gibt "52" aus.
  4. Null gibt 0 aus; Text gibt "52" aus.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Korrigiere Berechnungen und Entscheidungen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was gibt Math.floor(-3.2) zurück?
  1. -3
  2. -4
  3. 4
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Welche Meldung erzeugt bei const count = 2; der Ausdruck `Packed ${count} ${count === 1 ? "box" : "boxes"}`?
  1. „Packed 2 box“
  2. „Packed 2 false“
  3. „Packed 2 boxes“
  4. „Packed count boxes“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Prüfung der Endung soll unabhängig von der Groß- und Kleinschreibung funktionieren. Welcher Ausdruck erkennt bei const label = "Draft.PDF"; die PDF-Endung?
  1. label.toLowerCase().endsWith(".pdf")
  2. label.endsWith(".pdf")
  3. label.trim().endsWith(".pdf")
  4. label.toUpperCase().endsWith(".pdf")
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Das Ergebnis einer fehlgeschlagenen numerischen Umwandlung ist in value gespeichert. Welche Prüfung erkennt diesen Wert korrekt als NaN?
  1. value === NaN
  2. typeof value === "NaN"
  3. value == NaN
  4. Number.isNaN(value)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welche Werte enthalten saved und total am Ende?

let total = 8;
const saved = total++;
total *= 3;
total -= saved;
  1. saved = 9, total = 18
  2. saved = 8, total = 16
  3. saved = 9, total = 19
  4. saved = 8, total = 19
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Anzahl soll nur dann den Standardwert 3 erhalten, wenn die ursprüngliche Anzahl null oder undefined ist. Welche Ergebnisse liefern count ?? 3 und count || 3, wenn count gleich 0 ist, und welcher Ausdruck erfüllt die Regel?
  1. 3 und 3; beide Ausdrücke erfüllen die Regel.
  2. 0 und 0; beide Ausdrücke erfüllen die Regel.
  3. 0 und 3; der Ausdruck mit Nullish-Coalescing erfüllt die Regel.
  4. 3 und 0; der ODER-Ausdruck erfüllt die Regel.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Auszeichnung soll ab 90 „gold“ und bei 70–89 „silver“ sein. Was ist an diesem Ergebnis falsch und welche Änderung korrigiert die überlappenden Schwellenwerte?

const points = 94;
let badge;
if (points >= 70) {
  badge = "silver";
} else if (points >= 90) {
  badge = "gold";
} else {
  badge = "none";
}
  1. Es weist „gold“ zu; prüfe 70 vor 90.
  2. Es weist „silver“ zu; prüfe 90 vor 70.
  3. Es weist „silver“ zu; ändere >= 90 zu > 90.
  4. Es weist „none“ zu; ändere >= 70 zu > 70.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Nach der Umwandlung einer Antwort aus einem prompt-Dialog verwendet ein Programm if (!value), um ungültige numerische Eingaben zurückzuweisen. Der Nutzer gibt "0", "bad" oder "-2" ein. Welches Fehlverhalten zeigt diese Prüfung?
  1. Sie weist null und NaN zurück, akzeptiert aber die negative Zahl.
  2. Sie akzeptiert null, weist aber NaN und die negative Zahl zurück.
  3. Sie weist alle drei zurück, weil keine davon eine positive Zahl ist.
  4. Sie akzeptiert alle drei, weil prompt-Antworten Zeichenketten sind.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Was wird ausgegeben?

let stock = 0;
let status = "empty";
if (stock = 3) {
  status = "ready";
}
console.log(stock, status);
  1. 0 empty
  2. 0 ready
  3. 3 ready
  4. 3 empty
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Summe überschreitet ihren Grenzwert nur bei manchen Eingaben. Du benötigst alle lokalen Werte in der ersten Zeile des Zweigs für hohe Summen, ohne bei gewöhnlichen Fällen anzuhalten. Was solltest du setzen und untersuchen?
  1. Einen Protokollpunkt in dieser Zeile; den angehaltenen Bereich Scope untersuchen.
  2. Einen bedingten Haltepunkt in dieser Zeile; Scope und Watch untersuchen.
  3. Einen Haltepunkt nach Ausführungsende; frühere aktuelle Werte untersuchen.
  4. Einen Ausnahmehaltepunkt; warten, bis die falsche Summe einen Fehler auslöst.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 6: Kombiniere Eingaben, Typen und Kontrollfluss10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Zwei externe klassische Skripte hängen von der HTML-Reihenfolge ab und müssen ausgeführt werden, nachdem das Dokument geparst wurde. Welches Ladeattribut sollten beide verwenden?
  1. async
  2. Nur src
  3. defer nur bei Inline-Kopien
  4. defer
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Ausgabe zeigt einen Wert, dessen typeof gleich "number" ist, der aber nie sich selbst gleich ist. Welcher Wert ist es und wie solltest du ihn direkt prüfen?
  1. NaN; verwende Number.isNaN(value).
  2. null; verwende value === null.
  3. undefined; verwende value === undefined.
  4. Infinity; verwende value === Infinity.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was wird ausgegeben?

const massKg = 2.75;
const message = `Load: ${(massKg * 4).toFixed(2)} kg`;
console.log(message);
  1. „Load: 11 kg“
  2. „Load: 2.754 kg“
  3. „Load: 11.00 kg“
  4. „Load: 11.0 kg“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Du setzt einen Haltepunkt auf const cleaned = raw.trim(); und die Ausführung hält dort an. Wie erhältst und untersuchst du den initialisierten Wert von cleaned?
  1. Die Variable cleaned untersuchen, bevor die Anweisung ausgeführt wird.
  2. Die Anweisung mit einem Prozedurschritt ausführen und dann cleaned untersuchen.
  3. Fortsetzen und eine Unterbrechung in der nächsten Zeile erwarten.
  4. Herausspringen, um die Initialisierung der Variablen zu überspringen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was wird ausgegeben?

const raw = "18";
const fee = 3;
const total = raw * 2 + fee;
const label = raw + fee * 2;
console.log(total, label);
  1. "363" und "186"
  2. 39 und 42
  3. 39 und "186"
  4. "363" und 42
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Welchen Wert weist dieser Code bei einer Zeichenkette oder null als Eingabe label zu, wenn input gleich " " ist?

const input = "   ";
const cleaned = input !== null && input.trim();
const label = cleaned ?? "Guest";
  1. ""
  2. "Guest"
  3. false
  4. null
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Was wird ausgegeben?

const raw = "3";
let result = "";
switch (Number(raw)) {
  case 3:
    result += "M";
  case 4:
    result += "N";
    break;
  default:
    result = "X";
}
console.log(result);
  1. „M“
  2. „MN“
  3. „X“
  4. „MNX“
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Die letzte Ausgabe soll für jeden Zweig eine Versandbezeichnung ausgeben. Welche Korrektur erhält das beabsichtigte äußere Ergebnis?

let label = "pending";
if (true) {
  let label = "sent";
}
console.log(label);
  1. Die äußere Deklaration zu const label = "pending"; ändern.
  2. Die innere Deklaration zu const label = "sent"; ändern.
  3. Die äußere Deklaration entfernen und die letzte Ausgabe behalten.
  4. Die innere Zeile zu label = "sent"; ändern.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Messwert kann null, NaN oder eine Zahl sein. Das gültige Intervall schließt 0 und 10 ein. Welche Prüfung akzeptiert genau die numerischen Werte in diesem Intervall?
  1. !Number.isNaN(value) && value >= 0 && value <= 10
  2. value !== null && !Number.isNaN(value) && value > 0 && value < 10
  3. value !== null && !Number.isNaN(value) && value >= 0 && value <= 10
  4. value !== null && !Number.isNaN(value) && (value >= 0 || value <= 10)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Skript lädt ohne Fehler, zeigt aber für die Messwerte 8, 12 und 36 einen Mittelwert von 32 an. Die Ausgabe für die Summe ist 56; die Berechnung lautet 8 + 12 + 36 / 3. Welche Diagnose und Korrektur passen zu allen Hinweisen?
  1. Nur 36 wird dividiert; verwende (8 + 12 + 36) / 2.
  2. Nur ein Teil der Summe muss gruppiert werden; verwende 8 + (12 + 36) / 3.
  3. Die ersten beiden Werte müssen gruppiert werden; verwende (8 + 12) / 3 + 36.
  4. Nur 36 wird dividiert; verwende (8 + 12 + 36) / 3.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

85 Schlüsselbegriffe, jeweils mit Definition

A

Ablaufverfolgung
Die Ablaufverfolgung verfolgt die Ausführung und Zwischenwerte, um zu finden, wo das tatsächliche Verhalten erstmals vom erwarteten Ergebnis abweicht.
Die separate Ausgabe von Summe und Divisor kann einen falschen Mittelwert auf den Schritt eingrenzen, der die Rechnung gruppiert.
Anweisung
Eine Anweisung ist eine JavaScript-Instruktion, die eine Aktion ausführt, etwa eine Variable deklariert, einen Wert zuweist oder einen Ausführungszweig auswählt.
In let score = 8; console.log(score); wird die Deklarationsanweisung vor der Ausgabeanweisung ausgeführt.
Arithmetischer Operator
Ein arithmetischer Operator führt eine Rechnung aus, etwa eine Addition, Subtraktion, Multiplikation, Division, Divisionsrestberechnung oder Potenzierung.
Der Ausdruck massKg * count verwendet Multiplikation, um aus zwei Zahlenwerten die Gesamtmasse zu berechnen.
async-Attribut
Das async-Attribut erlaubt, ein Skript während des Parsens herunterzuladen und auszuführen, sobald es bereit ist, ohne die HTML-Reihenfolge beizubehalten.
Ein unabhängiger Besucherzähler kann async verwenden, wenn kein anderes Skript davon abhängt, dass er zuerst läuft.
Ausdruck
Ein Ausdruck ist JavaScript-Code, der zu einem Wert ausgewertet wird, den ein anderer Ausdruck oder eine Anweisung weiterverwenden kann.
Der Ausdruck price * count kann einen Wert für eine Zuweisung oder einen Template-Platzhalter liefern.
Ausführungszweig
Ein Ausführungszweig ist ein durch eine Bedingung ausgewählter Codeblock, der es einem Programm ermöglicht, für verschiedene Fälle unterschiedliche Anweisungen auszuführen.
Ein else-Zweig kann eine Liefergebühr zuweisen, wenn die Bedingung für kostenlose Lieferung als Falsy-Wert ausgewertet wurde.

B

Bedingter Haltepunkt
Ein bedingter Haltepunkt hält nur dann an seiner Zeile an, wenn ein angegebener Ausdruck wahr ist, und hilft so, die Untersuchung auf relevante Fälle zu konzentrieren.
Ein Haltepunkt mit der Bedingung total > 200 überspringt gewöhnliche kleinere Summen und hält an, wenn ein hohes Ergebnis untersucht werden muss.
Bedingter Operator
Der bedingte Operator ist der Ausdruck condition ? a : b, der eine Bedingung auswertet und den ausgewählten Wertausdruck zurückgibt.
Eine kurze Zuweisung kann anhand eines booleschen Werts "open" oder "closed" wählen, ohne zwei separate Zuweisungszweige zu schreiben.
Bindung
Eine Bindung ist die Zuordnung zwischen einem Namen und dem Wert, auf den er verweist; const verhindert nach der Initialisierung, dass diese Zuordnung ersetzt wird.
Das Ändern einer Eigenschaft eines const-Objekts erhält seine Bindung, weil der Name weiterhin auf dasselbe Objekt verweist.
Blockgültigkeitsbereich
Der Blockgültigkeitsbereich ist der Bereich aus einem umgebenden Block und seinen verschachtelten Blöcken, zu dem eine let- oder const-Bindung gehört.
Ein const message, das innerhalb eines if-Rumpfs deklariert wurde, kann nach dem Ende dieses Rumpfs nicht gelesen werden.
Boolescher Kontext
Ein boolescher Kontext ist eine Stelle, an der entschieden wird, ob ein Wert ein Truthy- oder Falsy-Wert ist, und dies das Verhalten bestimmt, etwa bei einer if-Bedingung oder der Prüfung eines logischen Operators.
Ein nicht leerer Spitzname besteht eine if-Prüfung, eine leere Zeichenkette dagegen nicht, obwohl beide Werte den Typ string haben.
Boolescher Wert
Ein boolescher Wert ist einer der beiden Werte true und false, die häufig durch Vergleiche erzeugt werden und Ja-Nein-Ergebnisse darstellen.
Der Ausdruck heightM >= 2 gibt einen booleschen Wert zurück, der entscheiden kann, ob eine Höhe eine Anforderung erfüllt.

C

camelCase
camelCase ist ein Benennungsstil, bei dem ein mehrteiliger Name klein beginnt und jedes weitere Wort ohne Leerzeichen mit einem Großbuchstaben beginnt.
Die Namen firstName und totalMassKg zeigen Wortgrenzen und bleiben zugleich gültige JavaScript-Namen.

D

Datentyp
Ein Datentyp ist eine Kategorie von Werten, die mitbestimmt, welche Operationen anwendbar sind und wie diese mit den Werten umgehen.
Die Werte 9 und "9" sehen in der Ausgabe ähnlich aus, aber ihre Typen erklären, warum die Addition von eins unterschiedliche Ergebnisse liefert.
De-Morgan-Gesetze
Die De-Morgan-Gesetze beschreiben, wie die Negation einer kombinierten booleschen Prüfung jeden Operanden umkehrt und UND gegen ODER beziehungsweise ODER gegen UND austauscht.
Ein Wert außerhalb eines Intervalls einschließlich seiner Grenzen liegt unter der unteren Schranke ODER über der oberen Schranke; das kehrt die Prüfung auf Werte innerhalb des Intervalls um.
Debugger
Ein Debugger ist ein Entwicklungswerkzeug, das die Ausführung anhalten, Werte im angehaltenen Gültigkeitsbereich untersuchen und Code schrittweise ausführen kann.
Eine Unterbrechung vor einer Bedingung, die eine Summe verwendet, kann zeigen, dass die Summe verbundener Text ist, obwohl die Bedingung sie später in eine Zahl umwandelt.
defer-Attribut
Das defer-Attribut bewirkt, dass ein externes klassisches Skript nach dem HTML-Parsen ausgeführt wird, und erlaubt zugleich seinen Download während des Parsens.
Zwei externe klassische Skripte mit defer laufen in ihrer HTML-Reihenfolge, auch wenn der zweite Download zuerst abgeschlossen ist.
Deklaration
Eine Deklaration führt mit einem Schlüsselwort wie let oder const einen Namen in einen Gültigkeitsbereich ein und kann auch seinen Anfangswert angeben.
Die Anweisung let result; deklariert eine Variable, bevor späterer Code entscheidet, welcher Wert darin gespeichert wird.
Divisionsrest
Ein Divisionsrest ist der Wert, der nach Berücksichtigung ganzer Divisionen übrig bleibt; der JavaScript-Operator % erzeugt diesen Wert.
Bei einer positiven Länge von 478 cm ergibt 478 % 100 die 78 cm, die nach den ganzen Metern übrig bleiben.
Dynamische Typisierung
Dynamische Typisierung bedeutet, dass Werte Typen haben, während eine Variable nach Neuzuweisungen auf Werte unterschiedlicher Typen verweisen kann.
Nach let data = 5; data = "five"; meldet typeof data den Typ des neuen Zeichenkettenwerts.

E

Eingabevalidierung
Die Eingabevalidierung prüft, ob ein eingegebener Wert die Anforderungen eines Programms erfüllt, bevor er weiterverwendet wird.
Eine Mengenprüfung kann zuerst „Abbrechen“ und leeren Text zurückweisen und nach der Umwandlung NaN oder negative Zahlen ablehnen.
else-if-Kette
Eine else-if-Kette ist eine geordnete Folge von Bedingungen, die den ersten Zweig mit erfüllter Bedingung ausführt und alle späteren Zweige überspringt.
Wird die höchste Mindestpunktzahl zuerst geprüft, verhindert das, dass ein niedrigerer Schwellenwert ein Ergebnis mit höherer Punktzahl zu früh erfasst.
Escape-Sequenz
Eine Escape-Sequenz beginnt mit einem umgekehrten Schrägstrich und stellt in einer Zeichenkette ein Zeichen dar, etwa ein Anführungszeichen, einen Zeilenumbruch, einen Tabulator oder einen umgekehrten Schrägstrich.
Die Sequenz erzeugt einen Zeilenumbruch innerhalb von Text, selbst wenn der Code in einer einzigen Zeile geschrieben wird.
Explizite Typumwandlung
Eine explizite Typumwandlung ist eine vom Programmierer bewusst geschriebene Typänderung mit einer Operation wie Number(), String() oder Boolean().
Wird input vor der Addition einer Gebühr umgewandelt, wird deutlich, dass das Programm eine numerische Summe erwartet.
Externes Skript
Ein externes Skript ist JavaScript, das in einer separaten Datei gespeichert ist und das ein HTML-script-Element über sein src-Attribut lädt.
Das Element <script src="js/start.js"></script> verbindet die Seite mit Code in einem Unterordner.

F

Fall-through
Fall-through ist das Fortsetzen der Ausführung von einem passenden switch-Fall in spätere Fälle, weil kein break oder anderer Ausstieg sie gestoppt hat.
Aufeinanderfolgende case-Marken können sich absichtlich eine Zuweisung teilen, aber ein fehlendes break kann auch eine unerwünschte zweite Bezeichnung anhängen.
Falsy-Wert
Ein Falsy-Wert ist ein Wert, der bei der booleschen Umwandlung zu false wird, darunter die Zahl null, leerer Text, null, undefined und NaN.
Eine numerische Menge von 0 überspringt if (quantity), selbst wenn null im Programm eine erlaubte Antwort ist.
Formatierung
Die Formatierung ändert, wie ein Wert als Text dargestellt wird, etwa durch eine feste Anzahl von Nachkommastellen, und lässt die ursprüngliche Zahl unverändert.
Die Verwendung von (6).toFixed(2) innerhalb eines Templates zeigt "6.00" an, ohne den ursprünglichen Zahlenwert zu ändern.

G

Gleitkommadarstellung
Die Gleitkommadarstellung ist eine Zahlendarstellung mit einer endlichen Anzahl binärer Ziffern, sodass viele Dezimalbrüche nur näherungsweise gespeichert werden.
Eine Summe wie 0.1 + 0.2 kann zusätzliche Stellen am Ende zeigen, weil die gespeicherten Brüche Näherungswerte sind.
Globaler Gültigkeitsbereich
Der globale Gültigkeitsbereich ist der seitenweite Gültigkeitsbereich von Bindungen auf oberster Ebene klassischer Skripte, auf die andere klassische Skripte nach der Initialisierung zugreifen können.
Ein späteres klassisches Skript kann ein let count auf oberster Ebene lesen, das ein früheres klassisches Skript angelegt hat.

H

Haltepunkt
Ein Haltepunkt markiert eine Stelle, an der die Ausführung vor einer Anweisung anhalten soll, damit der aktuelle Programmzustand untersucht werden kann.
Lade die Seite nach dem Setzen eines Haltepunkts in einem beim Laden ausgeführten Skript neu, damit die Ausführung diese Anweisung erneut erreicht.

I

Implizite numerische Typumwandlung
Eine implizite numerische Typumwandlung ist die automatische Umwandlung in einen Zahlenwert während einer Operation, die Zahlen erwartet, etwa einer Subtraktion.
Der Ausdruck "14" - 2 erzeugt 12, ohne eine Variable zu ändern, die ursprünglich die Zeichenkette gespeichert hat.
Implizite Typumwandlung
Eine implizite Typumwandlung ist die automatische Umwandlung des Typs eines Werts durch einen Operator oder eine Bedingung nach den JavaScript-Regeln für diese Operation.
In "8" * 2 wandelt die Multiplikation den Text für die Berechnung implizit in eine Zahl um und erzeugt 16.
Index
Ein Index ist eine nummerierte Position für den Zugriff auf die Codeeinheiten einer Zeichenkette; er beginnt bei null und endet bei Länge minus eins.
In "planet" enthält Index 0 den Wert "p" und Index 5 den Wert "t"; Index 6 liegt hinter dem Ende.
Infinity
Infinity ist ein spezieller Zahlenwert, der ein unbegrenztes positives Ergebnis darstellt; JavaScript hat auch den Wert negatives Infinity.
Die Berechnung 8 / 0 gibt Infinity zurück, sodass eine Division durch null nicht immer eine Ausnahme auslöst.
Initialisierung
Die Initialisierung gibt einer deklarierten Bindung ihren Anfangswert; eine const-Deklaration muss diesen Wert in der Deklaration selbst enthalten.
In const widthM = 4; ist die Zahl 4 der Initialisierer, durch den die Bindung zum Lesen bereit wird.
Inline-Skript
Ein Inline-Skript ist JavaScript, das innerhalb eines script-Elements in einem HTML-Dokument zwischen dessen öffnendem und schließendem Tag geschrieben wird.
Ein kurzer Block <script>console.log("Hello");</script> kann eine Meldung direkt aus einer HTML-Seite ausgeben.
Interpolation
Interpolation ist das Einfügen eines ausgewerteten Ausdrucks in umgebenden Text, wie JavaScript es in Template-Platzhaltern tut.
Bei name = "Nora" erzeugt die Interpolation in `Hello, ${name}` die Begrüßung „Hello, Nora“.

J

JavaScript-Engine
Eine JavaScript-Engine ist die Komponente des Browsers, die JavaScript-Code liest und ausführt und dabei seine Berechnungen und Entscheidungen durchführt.
Wenn die Seite ihr Skript lädt, führt die Engine console.log("Ready"); aus und die Konsole zeigt „Ready“.

K

Kommentar
Ein Kommentar ist für menschliche Leser gekennzeichneter Text, den JavaScript bei der Ausführung überspringt; er wird mit // oder einem zusammengehörigen Paar aus /* und */ markiert.
Wird // vor eine vorübergehende Ausgabe gesetzt, wird diese nicht ausgeführt, der Text bleibt aber für später verfügbar.
Konkatenation
Konkatenation verbindet Textwerte zu einer neuen Zeichenkette; der Operator + tut dies, wenn seine gewöhnlichen primitiven Operanden eine Zeichenkette enthalten.
Die Verbindung "Good" + " " + "morning" enthält ein Leerzeichen, weil die mittlere Zeichenkette es ausdrücklich liefert.
Konsole
Die Konsole ist ein Bereich der Entwicklerwerkzeuge, der Skriptmeldungen und Fehler anzeigt und in dem du JavaScript-Ausdrücke auswerten kannst.
Die Eingabe von 6 * 7 in die Konsole der Seite zeigt 42, ohne eine Anweisung zum gespeicherten Skript hinzuzufügen.
Kurzschlussauswertung
Die Kurzschlussauswertung überspringt einen Operanden, sobald ein früherer Operand das Ergebnis festlegt, etwa bei einem Falsy-Wert als linkem Operanden von UND.
Wird input !== null in einer UND-Schutzprüfung zuerst geprüft, kann dies bei null als Eingabe einen unsicheren Aufruf von input.trim() verhindern.

L

Laufzeitfehler
Ein Laufzeitfehler ist eine Ausnahme, die während der Ausführung von Code ausgelöst wird; bleibt sie unbehandelt, stoppt sie diese Ausführung an der fehlerhaften Operation.
Eine unbekannte Variable in einer späteren Zeile kann das Skript stoppen, nachdem seine früheren Ausgabeanweisungen bereits ausgeführt wurden.
Logischer Fehler
Ein logischer Fehler ist ein Fehler in der Logik oder Berechnung eines Programms, bei dem der Code zwar ausgeführt wird, aber ein falsches Ergebnis liefert.
Wird nur die letzte Zahl einer Summe dividiert, kann der falsche Mittelwert ausgegeben werden, ohne dass eine automatische Fehlermeldung entsteht.
Logisches NICHT
Das logische NICHT ist der Operator !, der einen Operanden in einen booleschen Wert umwandelt und diesen umkehrt; zweimal angewendet ergibt er dessen Truthy- oder Falsy-Wert als booleschen Wert.
Der Ausdruck !"0" ist false, weil die nicht leere Zeichenkette ein Truthy-Wert ist, bevor ihr boolescher Wert umgekehrt wird.
Logisches ODER
Das logische ODER ist der Operator ||, der erfüllt ist, wenn mindestens eine boolesche Prüfung erfüllt ist, und die Auswertung beim ersten Truthy-Operanden stoppt.
Ein Mitgliedschafts-Flag oder eine ausreichend hohe Summe kann eine Versandbedingung erfüllen; beide müssen nicht zugleich erfüllt sein.
Logisches UND
Das logische UND ist der Operator &&, der verlangt, dass beide booleschen Prüfungen erfüllt sind, und die Auswertung beim ersten Falsy-Operanden stoppt.
Eine Bereichsprüfung verbindet die untere und obere Schranke mit &&, sodass ein Messwert beide Anforderungen erfüllen muss.
Lose Gleichheit
Lose Gleichheit ist der durch == ausgeführte Vergleich, der Operanden unterschiedlichen Typs nach eigenen Gleichheitsregeln umwandeln kann.
Der Ausdruck "12" == 12 ist nach der Umwandlung true; strikte Gleichheit liefert daher eine besser vorhersagbare Typprüfung.

M

Methode
Eine Methode ist eine Funktion, auf die über einen Wert oder ein Objekt zugegriffen wird und die mit Klammern aufgerufen wird, um eine Operation darauf auszuführen.
Der Aufruf label.toLowerCase() erzeugt Text in Kleinbuchstaben; werden die Klammern weggelassen, wird die Methode nicht aufgerufen.
Methodenverkettung
Bei der Methodenverkettung wird eine Methode auf dem Rückgabewert des vorherigen Aufrufs aufgerufen, sodass kompatible Umwandlungen nacheinander geschrieben werden können.
Der Ausdruck " Note ".trim().toLowerCase() entfernt zuerst äußere Leerzeichen und ändert dann die Groß- und Kleinschreibung des Ergebnisses.
Modulskript
Ein Modulskript ist ein mit type="module" geladenes Skript, das einen eigenen Gültigkeitsbereich auf oberster Ebene hat, den strikten Modus verwendet und standardmäßig verzögert ausgeführt wird.
Eine lokal bereitgestellte Seite kann <script type="module" src="js/main.js"></script> für ihren Modulcode laden.

N

NaN
NaN ist ein spezieller Wert des Typs number, der ein ungültiges numerisches Ergebnis oder eine ungültige Umwandlung markiert und sich selbst nicht gleich ist.
Die Umwandlung von "heavy" mit Number() ergibt NaN, was Number.isNaN() vor einer Rechnung erkennen kann.
null
null ist ein primitiver Wert, der häufig bewusst zugewiesen wird, um einen leeren oder fehlenden Wert in den eigenen Daten eines Programms darzustellen.
Ein abgebrochener prompt-Dialog gibt null zurück, worauf das Programm prüfen kann, bevor es versucht, eine Zeichenkettenmethode aufzurufen.
Nullish-Coalescing-Operator
Der Nullish-Coalescing-Operator ?? wählt nur bei null oder undefined einen Ersatzwert und erhält andere Falsy-Werte.
Ist count gleich 0, erhält count ?? 3 die Zahl null, während count || 3 sie durch den Ersatzwert ersetzt.

O

Operatorrangfolge
Die Operatorrangfolge ist die Regel, die bestimmt, welche Operatoren in einem Ausdruck zuerst binden, sofern Klammern die Gruppierung nicht ändern.
In 4 + 6 * 2 wird die Multiplikation vor der Addition ausgeführt, sodass das Ergebnis 16 statt 20 ist.
Ordnungsvergleich
Ein Ordnungsvergleich prüft die Reihenfolge mit <, >, <= oder >=; zwei Zeichenketten folgen der Textreihenfolge, während bei gemischten numerischen Operanden eine Umwandlung stattfinden kann.
Die Prüfung "30" < "7" ist als Textvergleich wahr; werden beide Werte in Zahlen umgewandelt, kehrt sich das Ergebnis um.

P

Parsen numerischer Präfixe
Beim Parsen numerischer Präfixe wird eine Zahl vom Anfang eines Textes gelesen; beim ersten Zeichen, das nicht zur Zahl passt, wird gestoppt.
Der Aufruf parseFloat("6.2 kg") liest 6.2, während Number("6.2 kg") die gesamte Zeichenkette als NaN zurückweist.
Platzhalter
Ein Platzhalter ist der Teil ${...} eines Template-Literals, in dem ein Ausdruck ausgewertet und seine Textform eingefügt wird.
In `Mass: ${count * massKg} kg` berechnet der Platzhalter die Gesamtmasse, bevor er sie einfügt.
Postfix-Inkrement
Das Postfix-Inkrement ist die Form name++, die die Variable um eins erhöht, aber ihren alten Wert an den umgebenden Ausdruck zurückgibt.
Bei let n = 3; const old = n++; erhält old den Wert 3, während das aktualisierte n zu 4 wird.
Primitiver Wert
Ein primitiver Wert ist ein Wert eines der sieben primitiven Typen von JavaScript, dessen Inhalt nicht an Ort und Stelle verändert werden kann.
Eine Zeichenkettenmethode gibt einen neuen Textwert zurück; sie kann den Inhalt der ursprünglichen Zeichenkette nicht überschreiben.
Protokollpunkt
Ein Protokollpunkt ist eine Markierung im Debugger, die eine Meldung ausgibt, wenn die Ausführung ihre Zeile erreicht, ohne anzuhalten oder das Skript zu bearbeiten.
Ein Protokollpunkt kann jeden erreichten Wert zeigen, während die Seite weiterläuft, anders als ein Haltepunkt, der die Ausführung stoppt.
Prozedurschritt
Der Prozedurschritt ist ein Steuerelement des Debuggers, das die aktuelle Anweisung ausführt und erneut anhält, ohne in Funktionen einzutreten, die diese Anweisung aufruft.
Führe eine Zuweisung mit einem Prozedurschritt aus, bevor du ihr neues Ergebnis untersuchst, denn die hervorgehobene Zeile wurde bei der Unterbrechung noch nicht ausgeführt.

R

ReferenceError
Ein ReferenceError ist ein Fehler, der ausgelöst wird, wenn auf eine Bindung nicht zugegriffen werden kann, etwa weil ihr Name unbekannt oder sie nicht initialisiert ist.
Ein Tippfehler in totl + 5 kann einen ReferenceError auslösen, obwohl eine richtig geschriebene Variable total in der Nähe existiert.

S

Standardfall
Ein Standardfall ist der Einstiegspunkt einer switch-Anweisung, der verwendet wird, wenn kein case-Wert zur Eingabe passt, und der Verhalten für nicht passende Werte bereitstellt.
Eine switch-Anweisung für Modi kann in default "normal" zuweisen, wenn die Eingabe keinem ihrer benannten Sondermodi entspricht.
Strikte Gleichheit
Strikte Gleichheit ist der durch === ausgeführte Vergleich, der Operandentypen nicht umwandelt und Werte unterschiedlichen Typs als ungleich behandelt.
Der Ausdruck "12" === 12 ist false, weil Zifferntext trotz Übereinstimmung einen anderen Typ als eine Zahl hat.
Strikter Modus
Der strikte Modus ist ein JavaScript-Ausführungsmodus, der bestimmte stillschweigende Fehler, darunter Zuweisungen an nicht deklarierte Namen, als Fehler meldet.
Wird ein klassisches Skript mit "use strict"; begonnen, hilft das, eine falsch geschriebene Variable bei ihrer ersten Zuweisung sichtbar zu machen.
switch-Anweisung
Eine switch-Anweisung vergleicht einen Wert strikt mit case-Marken, beginnt bei einem Treffer mit der Ausführung und fährt bis zu einem break oder dem Ende fort.
Ein Zeichenkettenwert "4" überspringt ein numerisches case 4:, sofern die Eingabe nicht vor der switch-Anweisung umgewandelt wurde.
Syntaxfehler
Ein Syntaxfehler ist ein Verstoß gegen die Grammatik von JavaScript, der verhindert, dass das betroffene Skript geparst und seine Ausführung begonnen wird.
Eine nicht geschlossene Klammer kann verhindern, dass selbst eine frühere Startmeldung in demselben Skript ausgegeben wird.

T

Template-Literal
Ein Template-Literal ist eine durch Backticks begrenzte Zeichenkette, die eingebettete Ausdrücke und wörtliche Zeilenumbrüche in ihrem Text unterstützt.
Eine Meldung wie `Count: ${count}` setzt die aktuelle Anzahl neben ihre beschreibende Bezeichnung.
Toleranz
Eine Toleranz ist eine gewählte Schranke für eine akzeptable numerische Differenz. Sie wird verwendet, wenn die Genauigkeit einer Berechnung exakte Gleichheit ungeeignet macht.
Der Vergleich einer absoluten Dezimaldifferenz mit einer kleinen Schranke kann Rundungsabweichungen zulassen, ohne exakte Gleichheit zu verlangen.
Truthy-Wert
Ein Truthy-Wert ist ein Wert, der bei der booleschen Umwandlung zu true wird; nicht leere Zeichenketten sind unabhängig von ihrem Wortlaut Truthy-Werte.
Die Zeichenketten "false" und "0" bestehen Prüfungen auf Truthy-Werte, weil beide Zeichen enthalten und nicht leer sind.
TypeError
Ein TypeError ist ein Fehler, der ausgelöst wird, wenn eine Operation für ihren Wert ungeeignet ist, etwa bei einem ungültigen Aufruf oder einer verbotenen Neuzuweisung einer const-Variablen.
Der Aufruf text.length() behandelt eine numerische Eigenschaft als Funktion, sodass die Operation einen TypeError auslöst.

U

Unäres Plus
Das unäre Plus ist der Operator +, der auf einen Operanden angewendet wird, um eine numerische Umwandlung zu verlangen, statt zwei Operanden zu addieren.
Der Ausdruck +"31" erzeugt die Zahl 31, während "31" + 1 Text verbindet und "311" erzeugt.
undefined
undefined ist der primitive Wert, der häufig verwendet wird, wenn kein Wert angegeben wurde, etwa nachdem eine let-Deklaration ohne Initialisierer ausgeführt wurde.
Nach let nickname; ergibt das Lesen der initialisierten Bindung undefined, bis eine weitere Zuweisung erfolgt.
Unveränderlichkeit
Unveränderlichkeit bedeutet, dass sich der Inhalt eines Werts nicht an Ort und Stelle ändern lässt; Operationen auf primitiven Werten erzeugen stattdessen neue Werte.
Die Zuweisung text = text.trim(); ersetzt den Wert der Variablen durch eine neue Zeichenkette, statt die alte zu bearbeiten.

Ü

Überwachungsausdruck
Ein Überwachungsausdruck ist ein Ausdruck, den der Debugger beim schrittweisen Durchgehen erneut auswertet, sodass du einen Wert oder eine Bedingung über mehrere Unterbrechungen hinweg verfolgen kannst.
Wird typeof total zu Watch hinzugefügt, kann das genau die Anweisung sichtbar machen, bei der ein Zahlenwert zu einer Zeichenkette wird.

V

Variable
Eine Variable ist eine benannte Bindung, die auf einen Wert verweist, sodass das Programm ihn erneut lesen und, falls die Bindung es erlaubt, neu zuweisen kann.
Ein Name wie distanceKm hält die gemessene Entfernung für spätere Berechnungen und Meldungen verfügbar.
Verdeckung
Verdeckung tritt auf, wenn ein innerer Gültigkeitsbereich einen Namen deklariert, der bereits in einem äußeren verwendet wird, und die äußere Bindung innerhalb des inneren Bereichs verbirgt.
Die Deklaration von let total = 2 innerhalb eines Blocks lässt eine separate äußere Variable total unverändert, wenn der Block endet.
Vergleich
Ein Vergleich wertet eine Beziehung zwischen Werten aus und erzeugt true oder false, etwa bei einer Übereinstimmung, einer Ungleichheit oder einer Schranke.
Der Vergleich massKg <= 20 schließt genau 20 ein und kann als boolesches Ergebnis einer Prüfung des Grenzwerts gespeichert werden.

Z

Zahlenbasis
Eine Zahlenbasis ist die Basis, mit der Ziffern interpretiert werden; parseInt() akzeptiert sie als zweites Argument, um die beabsichtigte Basis ausdrücklich anzugeben.
parseInt("11", 10) liest dezimal elf, während parseInt("11", 16) dezimal siebzehn liest.
Zeichenkette
Eine Zeichenkette ist eine unveränderliche Folge von UTF-16-Codeeinheiten zur Darstellung von Text, die mit zusammenpassenden Anführungszeichen oder Backticks geschrieben wird.
Die Ziffern in "203" bilden Text, der verbunden oder durchsucht werden kann, ohne zur Zahl 203 zu werden.
Zeitliche Totzone
Die zeitliche Totzone ist der Teil des Gültigkeitsbereichs einer Bindung vor ihrer Initialisierung, in dem der Zugriff auf eine let- oder const-Variable einen ReferenceError auslöst.
Ein inneres let price verhindert, dass ein früherer Lesezugriff im selben Block eine äußere price-Variable erreicht.
Zusammengesetzte Zuweisung
Eine zusammengesetzte Zuweisung verbindet eine Operation mit dem Speichern ihres Ergebnisses und verwendet dazu einen Operator wie +=, -= oder *= auf einer vorhandenen Variablen.
Bei let code = "7"; speichert code += 2 den Wert "72", weil die zusammengesetzte Addition weiterhin der Regel zur Textverknüpfung folgt.
Zuweisung
Eine Zuweisung wertet mit dem Operator = einen Ausdruck auf der rechten Seite aus und speichert dessen Wert in der benannten Bindung auf der linken Seite.
Die Aktualisierung count = count + 1; verwendet die vorherige Anzahl, um den Wert zu berechnen, der sie ersetzt.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten