Schleifen und Arrays in JavaScript

Lerne, JavaScript Aufgaben wiederholen und Datenlisten verarbeiten zu lassen. Schreibe for-, while- und do...while-Schleifen, die genau so oft wie nötig durchlaufen werden, speichere Werte in Arrays und füge ihre Elemente hinzu, entferne, suche und ändere sie. Verarbeite Listen mit for...of und Arraymethoden wie map, filter, find und reduce, sortiere Zahlen und Text in der von Lesern erwarteten Reihenfolge und kopiere und kombiniere Arrays mit der Spread-Syntax, ohne versehentlich die Originale zu verändern.

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

Was du lernst

  1. Schreibe for-, while- und do...while-Schleifen, die genau so oft wie nötig durchlaufen werden, verfolge sie Schritt für Schritt und steuere sie mit break und continue.
    • Zähle und wiederhole mit einer for-Schleife
      Schreibe eine for-Schleife aus ihren drei Teilen, verfolge ihren Zähler vom ersten bis zum letzten Schleifendurchlauf und bilde eine laufende Summe.
    • Wiederhole Anweisungen, solange eine Bedingung erfüllt ist
      Verwende while- und do...while-Schleifen, wenn die Anzahl der Wiederholungen nicht im Voraus bekannt ist, und stelle sicher, dass jede Schleife enden kann.
    • Beende Schleifen, überspringe Schleifendurchläufe und verschachtele Schleifen
      Verlasse eine Schleife mit break vorzeitig, überspringe mit continue einen Schleifendurchlauf und setze Schleifen ineinander, um Raster und Paare zu durchlaufen.
  2. Erstelle Arrays, lies und ändere ihre Elemente über den Index, füge Elemente hinzu und entferne sie, durchsuche Arrays und wandle Arrays in Text und Text in Arrays um.
    • Erstelle ein Array und lies seine Elemente
      Schreibe Arrayliterale, lies Elemente über ihren nullbasierten Index und greife mit length und at() auf das letzte Element zu.
    • Füge Elemente hinzu, entferne und ersetze sie
      Verändere Arrays direkt mit Indexzuweisung, push, pop, shift, unshift und splice, kopiere Teile mit slice und unterscheide Methoden, die ein Array verändern, von Methoden, die ein neues zurückgeben.
    • Durchsuche ein Array und wandle Arrays in Text und Text in Arrays um
      Prüfe, ob ein Array einen Wert enthält, finde die Position eines Werts, vergleiche Arrays richtig und wandle Zeichenketten mit split in Arrays und mit join zurück um.
  3. Besuche jedes Element eines Arrays mit for- und for...of-Schleifen und nutze gängige Schleifenmuster zum Summieren, Zählen, Suchen und Aufbauen von Ergebnissen.
    • Durchlaufe ein Array mit for und for...of
      Wähle zwischen einer indexbasierten for-Schleife und for...of, ermittle bei Bedarf den Index und vermeide for...in sowie Änderungen der Arraylänge während des Durchlaufens.
    • Nutze Schleifenmuster zum Summieren, Zählen, Suchen und Aufbauen von Ergebnissen
      Wende die Muster für Akkumulator, Zähler, Maximum, Suche und das Erstellen eines neuen Arrays auf echte Datenlisten an und verfolge sie Schritt für Schritt.
  4. Übergib kurze Pfeilfunktionen an Arraymethoden und verwende forEach, map, filter, find, some, every und reduce, um Daten zu transformieren, auszuwählen, zu durchsuchen und zusammenzufassen.
    • Übergib einer Arraymethode eine Funktion
      Schreibe kurze Pfeilfunktionen, verstehe, was ein Callback erhält und zurückgeben muss, und verwende forEach, um Code für jedes Element auszuführen.
    • Transformiere und wähle Elemente mit map und filter aus
      Verwende map, um jedes Element in einen neuen Wert umzuwandeln, und filter, um die Elemente zu behalten, die eine Prüfung bestehen, und verkette beide Methoden.
    • Finde Elemente und prüfe Bedingungen
      Verwende find, findIndex, findLast, findLastIndex, some und every, um ein Element zu finden oder eine Bedingung für eine Liste zu prüfen.
    • Fasse alle Elemente mit reduce zu einem Wert zusammen
      Verwende reduce mit einem Akkumulator und einem Anfangswert, um Summen, Anzahlen und Extremwerte zu berechnen, und verfolge jeden Schritt.
  5. Sortiere Zahlen und Text in der richtigen Reihenfolge, auch nach der alphabetischen Reihenfolge der Sprache deiner Leser, und kopiere und kombiniere Arrays mit der Spread-Syntax, ohne versehentlich die Originale zu verändern.
    • Sortiere Arrays aus Zahlen und Zeichenketten und kehre ihre Reihenfolge um
      Verwende sort mit einer Vergleichsfunktion, beachte, dass sort das Array verändert, und erhalte mit toSorted und toReversed sortierte Kopien beziehungsweise Kopien in umgekehrter Reihenfolge.
    • Sortiere und formatiere Texte passend zur Sprache deiner Leser
      Vergleiche Zeichenketten mit localeCompare und Intl.Collator für eine natürliche alphabetische Reihenfolge, halte Datumsangaben in sortierbarer Form und wandle Arrays mit join, Intl.ListFormat und Zahlenformatierung in lesbaren Text um.
    • Kopiere und kombiniere Arrays mit der Spread-Syntax
      Verstehe, dass Arrayvariablen auf ein gemeinsam genutztes Array verweisen, und verwende die Spread-Syntax, um Arrays zu kopieren, zusammenzuführen und einzufügen sowie Arrayelemente als separate Werte an eine Funktion zu übergeben.

Schleifen und Arrays in JavaScript einfach erklärt

5 Kapitel

1

Wiederhole Code mit Schleifen

Um Code zu wiederholen, brauchst du einen klaren Startpunkt, eine Prüfung und eine Möglichkeit, Fortschritt zu erzielen. Zählschleifen machen die Anzahl der Schritte sichtbar; bei bedingungsgesteuerten Schleifen entscheiden die Daten, wann gestoppt wird. Verfolge jede Variable, die sich ändert, um zu sehen, was vor und nach einer Prüfung ausgeführt wird. Nutze dann vorzeitige Ausstiege und verschachtelte Schleifen für Suchen, übersprungene Werte und Paare. Kleine Änderungen an einem Endpunkt oder einer Aktualisierung können das gesamte Ergebnis verändern.

1.1 Steuere eine Zählschleife

Eine Schleife wiederholt einen Codeblock. Jede Ausführung ihres Rumpfs ist ein Schleifendurchlauf. Du kannst ändern, wie oft die Arbeit wiederholt wird, indem du den Zähler und die Bedingung der Schleife änderst, ohne den Rumpf zu kopieren.

Lies die drei Teile
for (let i = 1; i <= 5; i++) {
  console.log(i);
}

Die Klammern enthalten eine Initialisierung, eine Bedingung und eine Aktualisierung, getrennt durch Semikolons. let i = 1 wird einmal ausgeführt. JavaScript prüft dann i <= 5. Ist die Bedingung wahr, gibt der Rumpf i aus, die Aktualisierung i++ addiert 1 und JavaScript prüft die Bedingung erneut. Eine falsche Bedingung beendet die Schleife, bevor der Rumpf erneut ausgeführt wird.

Wert vor der PrüfungBedingungAktion
1true1 ausgeben; auf 2 aktualisieren
2, 3, 4Jedes Mal trueJeden Wert ausgeben und aktualisieren
5true5 ausgeben; auf 6 aktualisieren
6falseStoppen

Es gibt fünf Schleifendurchläufe, aber sechs Prüfungen der Bedingung. Bei der letzten, fehlgeschlagenen Prüfung wird der Rumpf nicht ausgeführt. Eine Schleife, deren Bedingung zu Beginn falsch ist, hat keinen Schleifendurchlauf.

Wähle die Endpunkte und die Schrittweite

for (let i = 0; i < 10; i++) besucht 0 bis 9. Ein Start bei 1 mit i <= 10 besucht 1 bis 10. Beide laufen zehnmal durch. Bei einer Schrittweite von 1 von a in Richtung b ergibt < b genau b - a Schleifendurchläufe und <= b genau b - a + 1, wenn b mindestens so groß wie a ist.

Die Aktualisierung kann größere Schritte machen: for (let i = 0; i <= 20; i += 5) besucht 0, 5, 10, 15, 20. Zum Rückwärtszählen brauchst du sowohl eine abnehmende Aktualisierung als auch eine passende Bedingung: for (let i = 3; i >= 1; i--) besucht 3, 2, 1. Schreibe den ersten und letzten vorgesehenen Wert auf, bevor du < oder <= wählst; so erkennst du einen Off-by-one-Fehler.

Führe eine laufende Summe
let total = 0;
for (let i = 1; i <= 100; i++) {
  total += i;
}
console.log(total); // 5050

total ist ein Akkumulator: Er trägt das Ergebnis von einem Schleifendurchlauf in den nächsten. Nach den ersten drei Durchläufen enthält er 1, dann 3, dann 6. Setze seine Deklaration vor die Schleife, damit er einmal initialisiert wird. Eine Deklaration innerhalb des Rumpfs würde ihn jedes Mal zurücksetzen und nach der Schleife wäre er nicht verfügbar.

Untersuche eine Schleife, die sich seltsam verhält

Der Zähler im Kopf verwendet let, weil i++ ihm einen neuen Wert zuweist. Ein const-Zähler erlaubt die erste Ausführung des Rumpfs, löst aber bei der Aktualisierung einen TypeError aus. Ein im Kopf deklariertes let i gehört zur Schleife; es danach zu lesen löst einen ReferenceError aus, sofern außerhalb keine andere Variable namens i existiert.

Ein Semikolon direkt nach dem Kopf gibt der Schleife einen leeren Rumpf. In for (let i = 0; i < 3; i++); { console.log("Hello"); } wird der Block nach der Schleife einmal ausgeführt. Setze die öffnende geschweifte Klammer direkt an den Kopf. Prüfe schließlich die Richtung der Aktualisierung: Ein Start bei 0 mit i < 5 und i-- entfernt sich vom Abbruchpunkt und endet nie.

Wichtige Erkenntnisse

  • Die Initialisierung wird einmal ausgeführt; die Bedingung wird vor jedem Schleifendurchlauf geprüft; die Aktualisierung folgt auf den Rumpf.
  • Prüfe den ersten und letzten Zählerwert, um einen Off-by-one-Fehler zu erkennen.
  • Deklariere eine laufende Summe vor der Schleife, damit die bisherigen Ergebnisse erhalten bleiben.
  • Verwende let für einen Zähler, der sich ändert, und bewege ihn auf den Abbruchpunkt zu.

1.2 Wiederhole, bis sich eine Bedingung ändert

Manche Aufgaben enden, wenn ein Ergebnis einen Zielwert erreicht, nicht nach einer bekannten Anzahl von Schritten. Eine while-Schleife prüft diese Abbruchbedingung vor jeder Wiederholung. Eine do...while-Schleife prüft sie nach dem Rumpf.

Prüfe zuerst mit while
let balance = 1000;
let years = 0;
while (balance < 1500) {
  balance = balance * 1.05;
  years++;
}
console.log(years); // 9

Das Guthaben wächst um 5 % pro Jahr. Beide Variablen werden vor der Schleife initialisiert. Nach acht Wiederholungen beträgt das Guthaben etwa 1477.46 und liegt damit unter dem Zielwert, sodass eine weitere Wiederholung nötig ist. Nach neun beträgt es etwa 1551.33; die nächste Prüfung ist falsch. Runde das Guthaben während der Berechnung nicht, sondern runde nur das angezeigte Ergebnis.

Ist eine while-Bedingung anfangs falsch, wird der Rumpf keinmal ausgeführt. Setze bei einer einfachen Zählschleife die Initialisierung vor while und die Aktualisierung ans Ende des Rumpfs. So bleibt das Verhalten einer for-Schleife erhalten, wenn es kein continue gibt. Bei continue musst du besonders auf die Aktualisierung achten, da sie übersprungen werden kann.

Führe den Rumpf vor der Prüfung einmal aus
let n = 4096;
let digits = 0;
do {
  n = Math.floor(n / 10);
  digits++;
} while (n > 0);
console.log(digits); // 4

Math.floor rundet ab. Hier entfernt jede Division die letzte Ziffer: 4096 wird zu 409, dann zu 40, 4 und 0. Jedes Entfernen erhöht digits. Auch bei einem Start mit 0 wird der Rumpf einmal ausgeführt und die eine Ziffer korrekt gezählt. Eine vorher geprüfte while (n > 0)-Schleife würde diesen Fall überspringen und null Ziffern melden. Diese Methode zum Zählen von Ziffern ist für nicht negative ganze Zahlen gedacht.

SchleifeZeitpunkt der PrüfungMindestausführungen des Rumpfs
whileVor dem RumpfNull
do...whileNach dem RumpfEine

Bei let n = 10 wird ein do...while-Rumpf, der n ausgibt, einmal ausgeführt, selbst wenn seine Bedingung n < 5 lautet. Dieselbe vorher geprüfte Bedingung führt zu keiner Ausgabe. Das Semikolon gehört bei do...while hinter die abschließende Bedingung.

Bewege dich auf einen Ausstieg zu

Eine Endlosschleife wiederholt sich, ohne zu enden. Fehlt n++ in let n = 0; while (n < 3) { console.log(n); }, bleibt die Bedingung für immer wahr. Lange laufender Code kann einen Browser-Tab einfrieren. Verfolge, was die Bedingung verändert, und stoppe ein festhängendes Skript mit den Bedienelementen des Browsers.

Eine zusammengesetzte Bedingung wie attempts < 3 && !found läuft nur weiter, solange beide Prüfungen wahr sind. Sie stoppt, wenn drei Versuche verbraucht sind oder ein Ergebnis gefunden wurde. Bei einer nicht negativen ganzen Zahl, die bis auf null abnimmt, macht while (count > 0) einen Countdown deutlicher als while (count). Auch negative Zahlen sind truthy, sodass die Auswertung als Truthy-Wert allein nicht bedeutet, dass eine Anzahl positiv ist.

Vermeide Gleichheit als Abbruchprüfung bei Dezimalzahlen. Zehn Additionen von 0.1 ergeben in JavaScript 0.9999999999999999, sodass while (x !== 1) den vorgesehenen Endpunkt dauerhaft überschreiten kann. Ein Vergleich wie x < 1 erlaubt das Überschreiten der Schranke; ein ganzzahliger Zähler ist besser, wenn genau zehn Schritte nötig sind. Berechne jeden Dezimalwert aus diesem Zähler.

Wichtige Erkenntnisse

  • while kann keinmal ausgeführt werden; do...while wird immer mindestens einmal ausgeführt.
  • Wähle eine Bedingung anhand dessen, was noch geschehen muss, und ändere dann ihre Eingabewerte im Rumpf.
  • Eine zusammengesetzte Bedingung kann die Arbeit stoppen, wenn ein Grenzwert erreicht oder ein Ergebnis gefunden wird.
  • Durch Gleitkommarundung eignet sich exakte Gleichheit von Dezimalzahlen schlecht als Abbruchprüfung.
  • Verwende ganzzahlige Zähler, wenn die Anzahl der Wiederholungen exakt sein muss.

1.3 Stoppe eine Suche, überspringe Arbeit und besuche Paare

Eine Schleife kann verlassen werden, bevor ihre Bedingung falsch wird, oder Arbeit für nur ein Element überspringen. Mit verschachtelten Schleifen kannst du eine Folge innerhalb einer anderen wiederholen, etwa beim Besuchen von Zeilen und Spalten.

Abbrechen oder fortsetzen

break verlässt seine Schleife sofort. Um das erste Vielfache von 7 über 50 zu finden:

for (let n = 51; n <= 100; n++) {
  if (n % 7 === 0) {
    console.log(n); // 56
    break;
  }
}

Nach der Ausgabe von 56 wird die Ausführung nach der Schleife fortgesetzt. Die Werte 57 bis 100 werden nie geprüft. while (true) kann dasselbe Muster verwenden, wenn sich der Ausstieg am einfachsten innerhalb des Rumpfs prüfen lässt; ein erreichbares break muss den Ausstieg ermöglichen.

continue überspringt den Rest des aktuellen Schleifendurchlaufs. In einer for-Schleife führt es trotzdem die Aktualisierung im Kopf aus, bevor die Bedingung erneut geprüft wird:

for (let i = 1; i <= 9; i++) {
  if (i % 2 === 0) continue;
  console.log(i);
}

Die geraden Werte überspringen die Ausgabe, sodass 1, 3, 5, 7, 9 ausgegeben werden. Würde continue durch break ersetzt, würde die Schleife bei 2 enden und nur 1 ausgegeben.

In einer while-Schleife springt continue direkt zur Bedingung. Eine später im Rumpf platzierte Aktualisierung wird übersprungen. Ist i gleich 2 und beginnt der Rumpf mit if (i === 2) continue;, kann dieser Wert für immer hängen bleiben. Setze die nötige Aktualisierung vor diesen Sprung oder drücke das Zählen mit for aus.

Wiederhole eine innere Schleife für jede Zeile
for (let row = 1; row <= 3; row++) {
  let line = "";
  for (let col = 1; col <= 4; col++) {
    line = line + (row * col) + " ";
  }
  console.log(line.trim());
}

Für row = 1 besucht die innere Schleife die Spalten 1 bis 4 und erstellt den Text „1 2 3 4“. Für Zeile 2 beginnt sie erneut bei Spalte 1 und erzeugt „2 4 6 8“. Zeile 3 erzeugt „3 6 9 12“. Der innere Rumpf läuft zwölfmal: vier Spalten für jede der drei Zeilen. Deklariere line innerhalb des äußeren Rumpfs, damit jede Zeile mit einer leeren Zeichenkette beginnt.

Verwende unterschiedliche Namen für die Zähler. Ein inneres let i verdeckt ein äußeres i, sodass sich beide Positionen schwer lesen lassen.

Besuche jedes unterschiedliche Paar einmal

Beginne bei vier Personen mit den Nummern 0 bis 3 den inneren Zähler bei i + 1:

for (let i = 0; i < 4; i++) {
  for (let j = i + 1; j < 4; j++) {
    console.log(i, j);
  }
}

Die Paare sind 0–1, 0–2, 0–3, 1–2, 1–3, 2–3: sechs Besuche. Würde j bei 0 beginnen, gäbe es sechzehn Besuche, darunter Paare mit sich selbst und umgekehrte Duplikate.

Ein gewöhnliches break verlässt nur die innerste Schleife. Um eine verschachtelte Suche vollständig zu beenden, gib der äußeren Schleife eine Marke, zum Beispiel outer: for (...), und verwende beim Treffer break outer;. Die Marke benennt die Schleife, die verlassen werden soll; sie ändert nicht die Reihenfolge, in der die Paare geprüft werden.

Wichtige Erkenntnisse

  • break beendet eine Schleife; continue überspringt den Rest eines Schleifendurchlaufs.
  • continue führt die Aktualisierung einer for-Schleife aus, kann aber eine Aktualisierung innerhalb eines while-Rumpfs überspringen.
  • Die innere Schleife beginnt bei jedem äußeren Schleifendurchlauf erneut.
  • Verwende j = i + 1, um jedes unterschiedliche Paar einmal zu besuchen.
  • Ein gewöhnliches break verlässt die innerste Schleife.
  • Ein break mit Schleifenmarke kann auch eine äußere Schleife verlassen.
2

Speichere und verändere Datenlisten in Arrays

Eine Liste hat sowohl Werte als auch Positionen. Arrays halten diese Werte zusammen und geben jedem einen nummerierten Index. Das Lesen, Ersetzen, Einfügen und Entfernen von Elementen hängt von diesen Positionen ab, und Änderungen können späteren Elementen neue Indizes zuweisen. Lerne, was jede Methode zurückgibt und was sie verändert. Wähle dann Suchen und Textumwandlungen, die das Ergebnis in der für den nächsten Schritt benötigten Form liefern.

2.1 Lies Werte und Positionen in einem Array

Ein Array speichert eine geordnete Liste unter einem Namen. Seine Werte heißen Elemente. Ein Arrayliteral verwendet eckige Klammern und Kommas: const temps = [18, 21, 19, 24];. Das Literal [] erstellt ein leeres Array.

Zähle Positionen ab null
const colors = ["red", "green", "blue"];
console.log(colors[0]); // "red"
console.log(colors[2]); // "blue"
console.log(colors.length); // 3

Der Index eines Elements ist seine Position, gezählt ab null. Das dritte Element hat den Index 2. length zählt indizierte Stellen einschließlich aller leeren Stellen. Bei diesem lückenlosen Array ist das auch die Anzahl der Elemente. Der letzte Index ist colors.length - 1, sodass colors[colors.length - 1] „blue“ liest.

Das Lesen von colors[colors.length] fragt nach Index 3, einer Stelle hinter dem Ende, und ergibt undefined. Ein fehlender Index löst nicht allein deshalb einen Fehler aus, weil er fehlt. Auch colors[5] ergibt undefined.

Lies vom Ende aus

colors.at(-1) liest das letzte Element und colors.at(-2) das Element davor. Nicht negative Indizes funktionieren wie üblich: colors.at(0) liest „red“. Eine negative Zahl in eckigen Klammern hat eine andere Bedeutung: colors[-1] zählt nicht vom Ende zurück und ergibt für dieses Array undefined.

AusdruckErgebnis
colors[1]"green"
colors.at(-1)"blue"
colors[3]undefined
colors[-1]undefined
Lies eine Liste innerhalb einer Liste

Ein Element kann selbst ein Array sein:

const grid = [[1, 2, 3], [4, 5, 6]];
console.log(grid[1]); // [4, 5, 6]
console.log(grid[1][0]); // 4

Der erste Index wählt eine Zeile. Der zweite wählt einen Wert innerhalb dieser Zeile. grid.length ist 2, während grid[0].length gleich 3 ist. Diese Längen beschreiben unterschiedliche Arrays. Zeilen in einem verschachtelten Array können unterschiedliche Längen haben.

Arrays können Typen mischen, wie in [42, "km", true]. Eine Liste mit einer Datenart, etwa Temperaturen, ist leichter zu verarbeiten, weil jedes Element auf dieselbe Weise behandelt werden kann.

Erkenne ein Array und vermeide Überraschungen durch leere Stellen

typeof [1, 2] gibt „object“ zurück und ist daher keine spezifische Prüfung auf ein Array. Verwende Array.isArray(value): Es gibt true für [1, 2] und false für „12“ zurück.

new Array(3) erstellt drei leere Stellen; es speichert nicht die einzelne Zahl 3. Verwende [3] für ein Element oder [0, 0, 0] für drei ausdrücklich angegebene Nullen. Eine leere Stelle ergibt beim Lesen undefined, ist aber eine Lücke und kein ausdrücklich gespeicherter Wert. Arrayliterale zeigen den beabsichtigten Inhalt deutlich.

Lies Zeichenketten, ohne sie direkt verändern zu wollen

Zeichenketten unterstützen ebenfalls Indizierung, length und at(). "hello"[1] ist „e“ und "hello".at(-1) ist „o“. Zeichenketten sind unveränderlich: Eine Zuweisung an eine Zeichenposition ersetzt das Zeichen nicht. Im strikten Modus, auch in JavaScript-Modulen, löst diese Zuweisung einen TypeError aus. Erstelle eine neue Zeichenkette, wenn Text geändert werden muss.

Wichtige Erkenntnisse

  • Indizes beginnen bei 0; der letzte Index ist length - 1.
  • at(-1) liest das letzte Element; arr[-1] tut das nicht.
  • Lies verschachtelte Arrays mit jeweils einem Index.
  • Verwende Array.isArray, um Arrays zu erkennen.
  • Arrayliterale unterscheiden gespeicherte Werte von leeren Stellen.

2.2 Verändere ein Array oder kopiere einen Teil davon

Das Verändern eines bestehenden Arrays heißt Mutation. Manche Methoden verändern das Array; andere geben ein neues Array zurück. Der Rückgabewert einer Methode kann auch eine Länge oder ein entferntes Element sein, prüfe daher sowohl das Array als auch das Ergebnis des Aufrufs.

Ersetze Elemente und verändere die Enden
const scores = [70, 80, 90];
scores[1] = 85;
console.log(scores); // [70, 85, 90]

const sorgt dafür, dass scores auf dasselbe Array verweist. Der Inhalt des Arrays wird dadurch nicht eingefroren. Die Zuweisung scores = [] würde einen TypeError auslösen, eine Indexzuweisung ist aber erlaubt.

MethodeÄnderungRückgabewert
push(...items)Am Ende hinzufügenNeue Länge
pop()Am Ende entfernenEntferntes Element
unshift(...items)Am Anfang hinzufügenNeue Länge
shift()Am Anfang entfernenEntferntes Element

Bei const queue = ["Ana", "Ben"]; gibt queue.push("Cleo") den Wert 3 zurück. Das Array wird zu ["Ana", "Ben", "Cleo"]. Danach gibt queue.pop() „Cleo“ zurück und lässt die ersten beiden Namen übrig. Speicherst du das Ergebnis eines Aufrufs von push, speicherst du die Länge als Zahl und nicht das aktualisierte Array. pop und shift geben bei einem leeren Array undefined zurück. Das Hinzufügen oder Entfernen am Anfang verschiebt auch die anderen Indizes, was bei langen Arrays mehr Arbeit bedeuten kann.

Füge in der Mitte ein und entferne dort

splice(start, deleteCount, ...items) verändert das Array und gibt ein Array der entfernten Elemente zurück:

const days = ["Mon", "Tue", "Thu", "Fri"];
const removed = days.splice(2, 0, "Wed");
// days: ["Mon", "Tue", "Wed", "Thu", "Fri"]
// removed: []
const nextRemoved = days.splice(1, 2);
// days: ["Mon", "Thu", "Fri"]
// nextRemoved: ["Tue", "Wed"]

Der erste Aufruf beginnt bei Index 2, löscht keine Elemente und fügt dort „Wed“ ein. Der zweite beginnt bei Index 1 und entfernt zwei Elemente. Sein zweites Argument ist eine Anzahl, kein Endindex. Elemente nach einer Einfügung oder Entfernung erhalten neue Indizes.

Kopiere einen Bereich mit slice

slice(start, end) gibt ein neues Array zurück und schließt den Endindex aus. Bei const t = [10, 20, 30, 40, 50]; ergibt t.slice(1, 3) den Wert [20, 30] und lässt t unverändert. t.slice(-2) kopiert die letzten beiden Elemente, [40, 50]. Ohne Argumente kopiert t.slice() das ganze Array. Der zusätzliche Buchstabe in splice kennzeichnet eine andere Operation: Die Methode bearbeitet das Original; slice kopiert einen Bereich.

Halte die Liste frei von versehentlichen Lücken

Schreiben hinter das Ende erzeugt leere Stellen. Nach const a = [1, 2]; a[4] = 5; ist die Länge 5 und die Indizes 2 und 3 sind Lücken. Auch delete a[i] hinterlässt eine Lücke und erhält die Länge. Verwende push zum Anhängen und splice(i, 1), um ein Element zu entfernen und die Lücke zu schließen.

Die Zuweisung einer kleineren length entfernt Elemente vom Ende. a.length = 0 leert das Array. Die entfernten Elemente erscheinen nicht wieder, wenn die Länge später erhöht wird.

Auch sort und reverse verändern Arrays. Zu den kopierenden Methoden gehören slice, concat, map, filter, toSorted, toReversed, toSpliced und with. Wenn eine Methode ein neues Array zurückgibt, speichere oder verwende dieses Ergebnis; das Original enthält weiterhin seinen früheren Inhalt.

Wichtige Erkenntnisse

  • const verhindert eine Neuzuweisung der Variablen, erlaubt aber die Mutation des Arrays.
  • push und unshift geben Längen zurück; pop und shift geben entfernte Elemente zurück.
  • splice verändert das Array direkt und gibt die entfernten Elemente zurück.
  • slice kopiert einen Bereich, dessen Endindex ausgeschlossen ist.
  • delete hinterlässt eine Lücke; splice(i, 1) schließt sie.
  • Das Setzen einer kleineren length entfernt Elemente vom Ende.
  • Behalte das Ergebnis einer kopierenden Methode, wenn du das neue Array brauchst.

2.3 Suche Werte und wandle Listen in Text um

Eine Suche kann ein Ja-Nein-Ergebnis oder die Position eines Elements benötigen. Die Textumwandlung hat einen anderen Zweck: Sie ändert die Form der Daten, damit eine Liste gelesen, gespeichert oder verarbeitet werden kann.

Frage, ob oder wo

includes(value) gibt einen booleschen Wert zurück. ["tea", "coffee"].includes("tea") ist true; änderst du die Suche zu „Tea“, ergibt sie false. Beim Textabgleich wird die Groß- und Kleinschreibung beachtet und die Typen sind wichtig: [5].includes("5") ist false.

indexOf(value) gibt den ersten passenden Index zurück oder -1, wenn kein Wert passt. lastIndexOf sucht vom Ende aus. Bei [3, 7, 3, 9] steht die erste 3 an Index 0 und die letzte an Index 2. Die Suche nach 5 gibt -1 zurück.

Schreibe nicht if (arr.indexOf(x)). Index 0 ist falsy, während -1 truthy ist: Diese Prüfung lehnt einen Treffer am Anfang ab und akzeptiert einen fehlenden Wert. Verwende arr.indexOf(x) !== -1 oder includes, wenn die Position nicht benötigt wird.

Bei gewöhnlichen Werten verlangen beide Methoden denselben Typ und Wert, wie bei strikter Gleichheit. Der Umgang mit NaN unterscheidet sich: [1, NaN].includes(NaN) ist true, aber [1, NaN].indexOf(NaN) ist -1. Nach der von includes verwendeten Gleichheitsregel kann NaN mit sich selbst übereinstimmen.

Vergleiche Inhalte gezielt

Zwei getrennt erstellte Arrays sind unterschiedliche Arrays, auch wenn ihre Elemente übereinstimmen. [1, 2] === [1, 2] ist false; auch == vergleicht die Arrayidentität. Um denselben Inhalt in derselben Reihenfolge zu prüfen, vergleiche die Längen und dann die Werte an jedem entsprechenden Index. Eine bloße Ja-Nein-Prüfung auf Zugehörigkeit würde weder dieselbe Reihenfolge noch dieselbe Anzahl von Wiederholungen nachweisen.

Füge Elemente zu einer Zeichenkette zusammen
const dateParts = ["2026", "03", "15"];
console.log(dateParts.join("-")); // "2026-03-15"
console.log([1, 2, 3].join()); // "1,2,3"
console.log([1, 2, 3].join("")); // "123"

join setzt sein Trennzeichen zwischen die Elemente, niemals hinter das letzte. Das Standardtrennzeichen ist ein Komma ohne Leerzeichen. Elemente mit null und undefined tragen leeren Text bei. Wähle das Trennzeichen für eine lesbare Ausgabe ausdrücklich.

Auch + mit einer Zeichenkette wandelt ein Array in Text um, verwendet dabei aber Kommas: "List: " + [1, 2] wird zu „List: 1,2“. Die verschachtelte Struktur geht in diesem Text verloren: String([1, [2, 3]]) ergibt „1,2,3“. Gib das Array selbst in der Konsole aus, um seine Struktur zu untersuchen.

Zerlege Text in Teile

"red,green,blue".split(",") gibt ["red", "green", "blue"] zurück. Das Trennzeichen muss genau passen. Wird „red, green“ nur am Komma getrennt, bleibt das Leerzeichen am Anfang von „ green“ erhalten; die Trennung an „, “ entfernt das Komma und dieses Leerzeichen.

"4,8,15".split(",") gibt Zeichenketten zurück, keine Zahlen. Wandle jeden Teil um, bevor du Zahlenwerte addierst. Andernfalls kann der Operator + Text verketten, statt eine Summe zu bilden.

Bei einfachem Text aus Buchstaben erzeugt "stressed".split("").reverse().join("") den Wert „desserts“. Das Zerlegen erstellt ein neues Array, das Umkehren verändert dieses Array und das Zusammenfügen erstellt wieder eine Zeichenkette. Ein leeres Trennzeichen zerlegt UTF-16-Codeeinheiten; manche Symbole verwenden mehr als eine Einheit, daher ist dies keine allgemeine Methode, um jeden lesbaren Text umzukehren.

Wichtige Erkenntnisse

  • Verwende includes für die Zugehörigkeitsprüfung und indexOf oder lastIndexOf für Positionen.
  • Vergleiche einen Suchindex mit -1; nutze nicht seine Auswertung als Truthy- oder Falsy-Wert.
  • Getrennte Arrays werden anhand ihrer Identität verglichen, auch wenn ihre Werte gleich aussehen.
  • join erstellt Text; split erstellt ein Array aus Zeichenketten.
  • Leerzeichen gehören nur zum Trennzeichen, wenn du sie ausdrücklich aufnimmst.
  • Wandle Zahlentext vor dem Rechnen um.
3

Durchlaufe Arrays mit Schleifen

Das Durcharbeiten einer Liste ist leichter, wenn die Schleife die richtigen Informationen bereitstellt. Manchmal braucht der Rumpf nur jeden Wert, manchmal einen Index, einen vorherigen Wert oder einen Weg rückwärts durch das Array. Erstelle wiederverwendbare Muster für Summen, Anzahlen, Suchen und neue Listen und beobachte, wie sich jedes Ergebnis nach einem Schleifendurchlauf ändert. Diese Muster erklären auch die folgenden Arraymethoden.

3.1 Besuche Arraywerte, ohne sie zu überspringen

Eine Schleife kann Arraypositionen besuchen oder die Werte direkt übernehmen. Wähle die Form, die die vom Rumpf benötigten Informationen bereitstellt. Denke beim Einfügen oder Entfernen von Elementen daran, dass sich die Indizes des Arrays ändern.

Verwende Indizes für Positionen und Richtung
const fruits = ["apple", "pear", "plum"];
for (let i = 0; i < fruits.length; i++) {
  console.log(fruits[i]);
}

Die Indizes sind 0, 1, 2. Die Prüfung lautet < fruits.length, weil Index 3 hinter dem Ende liegt. Mit <= würde ein zusätzlicher Schleifendurchlauf undefined lesen. Indexbasierte Schleifen können auch rückwärts laufen, beginnend bei fruits.length - 1 und fortgesetzt, solange i >= 0 gilt, oder mit i += 2 jedes zweite Element besuchen.

Verwende for...of für Werte
for (const fruit of fruits) {
  console.log(fruit.toUpperCase());
}

Dies gibt „APPLE“, „PEAR“ und „PLUM“ aus. fruit enthält pro Schleifendurchlauf einen Wert. const funktioniert, weil jeder Schleifendurchlauf eine neue Bindung erstellt; die Schleife weist nicht einem gemeinsam genutzten Zähler neue Werte zu. for...of funktioniert auch bei Zeichenketten. Eine Schleife über „banana“ kann Vokale zählen, indem sie für jedes ch "aeiou".includes(ch) prüft.

Das Ändern einer lokalen Zahl schreibt nicht in das Array. Nach for (let n of nums) { n = n * 2; } sind die numerischen Elemente von nums unverändert. Um sie zu verändern, weise über nums[i] zu oder erstelle ein neues Array verdoppelter Zahlen.

Ermittle Werte und Indizes zusammen

entries() liefert Paare, die einen Index und einen Wert enthalten. Eckige Klammern im Schleifenkopf entpacken jedes Paar:

for (const [i, fruit] of fruits.entries()) {
  console.log((i + 1) + ". " + fruit);
}

Die Ausgabe lautet „1. apple“, „2. pear“, „3. plum“. Arrayindizes beginnen weiterhin bei null; i + 1 ändert nur die angezeigte Nummerierung.

BedarfNützliche Schleife
Jeder Wert der Reihe nachfor...of
Positionen, umgekehrte Reihenfolge oder NachbarnIndexbasiertes for
Wert und Index zusammenfor...of über entries()

for...in besucht Eigenschaftsnamen. Bei Arrays sind seine Indizes Zeichenketten und es kann zusätzliche Eigenschaften enthalten. Verwende die obigen Array-Schleifenformen, um Elemente zu verarbeiten.

Vermeide das Überspringen verschobener Elemente
const nums = [2, 4, 5, 6];
for (let i = 0; i < nums.length; i++) {
  if (nums[i] % 2 === 0) nums.splice(i, 1);
}
// nums is [4, 5]

An Index 0 verschiebt das Entfernen von 2 die 4 auf Index 0. Die Aktualisierung setzt i auf 1, sodass 4 übersprungen wird. Die Schleife sieht dann 5 und entfernt 6. Das Ergebnis enthält weiterhin eine gerade Zahl.

Wenn du anhand des Index entfernst, durchlaufe das Array vom Ende aus rückwärts. Das Entfernen eines Elements verschiebt dann nur bereits besuchte Positionen. Du kannst auch ein neues Array mit den zu behaltenden Werten erstellen. Vermeide es, Elemente zu demselben Array hinzuzufügen, während die Abbruchprüfung einer Schleife von seiner Länge abhängt; der Endpunkt kann sich immer weiter verschieben.

Wichtige Erkenntnisse

  • Besuche Indizes ab 0, solange i < arr.length gilt.
  • Verwende for...of, wenn nur Werte benötigt werden.
  • entries() liefert Index-Wert-Paare.
  • Die Neuzuweisung einer lokalen numerischen Schleifenvariablen ersetzt kein Arrayelement.
  • Beim Entfernen während des Vorwärtsdurchlaufens können verschobene Elemente übersprungen werden; durchlaufe das Array rückwärts oder erstelle ein neues.

3.2 Bilde Summen, suche und erstelle neue Listen

Viele Aufgaben mit Arrays nutzen dieselben einfachen Schleifenmuster. Entscheide, welches Ergebnis du brauchst, wähle seinen Anfangswert und aktualisiere es einmal für jedes relevante Element. Eine Ablaufverfolgung zeigt, was das Ergebnis nach jedem Schritt bedeutet.

Bilde eine Summe und zähle Treffer
const temps = [18, 21, 19, 24];
let sum = 0;
let warm = 0;
for (const t of temps) {
  sum += t;
  if (t > 20) warm++;
}

sum addiert jede Temperatur; warm erhöht sich nur bei einer Temperatur über 20 °C um eins. Die Variablen erfassen unterschiedliche Größen. Eine Ablaufverfolgung macht diesen Unterschied sichtbar:

tsum nach der Additionwarm nach der Prüfung
18180
21391
19581
24822

Der Durchschnitt ist sum / temps.length, also 20,5 °C. Prüfe die Länge vor der Division: Ein leeres Array ergibt 0 / 0, also NaN, keinen aussagekräftigen Durchschnitt.

Halte den größten oder kleinsten Wert fest

Initialisiere bei einem nicht leeren Array das Maximum mit seinem ersten Element. Ersetze es dann nur, wenn ein größerer Wert gefunden wird:

const values = [-3, -7, -1, -5];
let max = values[0];
for (const n of values) {
  if (n > max) max = n;
}
// max is -1

Bei einer Liste aus ausschließlich negativen Werten würde ein Start bei null fälschlich null beibehalten. Auch ein Start mit -Infinity funktioniert für ein Maximum, bei einer leeren Eingabe bleibt dann aber dieser Anfangswert stehen. Für ein Minimum kehre den Vergleich um und wähle das erste Element oder Infinity als Anfangswert.

Finde einen ersten Treffer oder prüfe eine ganze Liste

Eine Suche speichert einen Treffer und verlässt die Schleife mit break. Mit let firstWarm; kann die Schleife beim ersten t > 20 den Wert mit firstWarm = t zuweisen und abbrechen. Sie findet 21 und lässt spätere Elemente ungeprüft. Passt nichts, bleibt die Variable undefined.

Für eine „alle“-Prüfung initialisierst du ein Flag mit true und setzt es beim ersten Fehlschlag auf false. Für eine „mindestens eines“-Prüfung beginnst du mit false und setzt es beim ersten Erfolg auf true. Wenn Punktzahlen ab 50 als bestanden gelten, besteht [72, 85, 49] die Alle-bestanden-Prüfung bei 49 nicht. Bei einer leeren Liste bleibt der Anfangswert des Flags unverändert.

Erstelle veränderte Werte und vergleiche Nachbarn
const km = [1.5, 3, 0.25];
const meters = [];
for (const d of km) {
  meters.push(d * 1000);
}
// meters is [1500, 3000, 250]

Das neue Array beginnt leer und erhält pro Schleifendurchlauf eine umgerechnete Entfernung. Setze eine Bedingung vor push, wenn nur bestimmte Werte ins Ergebnis gehören.

Beginne für die Veränderungen von Tag zu Tag bei Index 1, weil es zu Index 0 keinen vorherigen Tag gibt:

const changes = [];
for (let i = 1; i < temps.length; i++) {
  changes.push(temps[i] - temps[i - 1]);
}
// changes is [3, -2, 5]

Es gibt eine Differenz weniger als Messwerte. Eine Subtraktion in umgekehrter Reihenfolge würde jedes Vorzeichen umkehren. Dieselben Ergebnisformen erscheinen bei Arraymethoden: map erstellt umgewandelte Werte, filter behält Treffer, find sucht, some und every prüfen und reduce sammelt Ergebnisse. Eine Schleife bleibt nützlich, wenn ein Durchlauf mehrere Ergebnisse liefern soll, wie bei sum und warm.

Wichtige Erkenntnisse

  • Beginne Summen und Anzahlen bei null und aktualisiere jede Größe für ihren eigenen Zweck.
  • Initialisiere einen Extremwert aus den Daten oder mit einem geeigneten Unendlichkeitswert.
  • Eine Suche nach dem ersten Treffer stoppt mit break.
  • Flags für „alle“ und „mindestens eines“ beginnen mit entgegengesetzten booleschen Werten.
  • Erstelle mit push ein neues Array, um das Original zu erhalten.
  • Beginne Vergleiche benachbarter Elemente bei Index 1.
  • Verfolge veränderliche Variablen, um zu finden, wo ein Ergebnis erstmals falsch wird.
4

Verarbeite Arrays mit Methoden, die Callbacks aufrufen

Mit Arraymethoden kann eine kurze Funktion beschreiben, was mit jedem Wert geschehen soll. Die Methode steuert das Durchlaufen, während der Callback eine Umwandlung, eine Prüfung oder das nächste Zwischenergebnis liefert. Achte genau auf den Rückgabewert: Er kann ein Array, ein Element, ein Index, ein boolescher Wert oder eine Summe sein. Dieselben wenigen Callback-Regeln gelten für all diese Aufgaben und sorgen auch bei einer leeren Liste für zuverlässiges Verhalten.

4.1 Übergib einer Arraymethode einen Callback

Eine Funktion nimmt Eingaben entgegen, führt Code aus und kann ein Ergebnis zurückgeben. Ein Callback ist eine Funktion, die einer anderen Funktion zum Aufrufen übergeben wird. Arraymethoden verwenden Callbacks, um die Arbeit für jedes Element zu beschreiben.

Schreibe eine kurze Pfeilfunktion

n => n * 2 nimmt einen Parameter namens n entgegen und gibt seinen verdoppelten Wert zurück. Der Pfeil trennt die Eingaben vom Rumpf. Bei einem einzelnen Parameter können die Klammern entfallen. Bei keinem oder mehreren Parametern sind sie nötig: () => 0 und (a, b) => a - b.

const double = n => n * 2;
const doubled = [1, 2, 3].map(double);
// doubled is [2, 4, 6]

double benennt die Funktion selbst. Die Methode ruft sie für jede Zahl auf. map(double()) würde sie sofort aufrufen und statt der Funktion das Ergebnis übergeben. Verwende bei einer benannten Prüfung wie function isEven(n) { return n % 2 === 0; } den Aufruf filter(isEven), damit die Methode jedes Element übergibt.

Gib aus einem Blockrumpf einen Wert zurück

Ein Ausdruck nach dem Pfeil wird automatisch zurückgegeben. Geschweifte Klammern erzeugen einen Block, daher braucht ein Ergebnis ein ausdrückliches return:

const double = n => {
  const doubled = n * 2;
  return doubled;
};

Ohne return gibt die Funktion undefined zurück. [1, 2, 3].map(n => { n * 2; }) erzeugt daher [undefined, undefined, undefined]. Die Multiplikation wird ausgeführt, aber ihr Wert wird nie zum Ergebnis des Callbacks.

Lies Callback-Argumente anhand ihrer Position

Methoden wie map, filter und forEach übergeben zuerst das Element, zweitens seinen nullbasierten Index und drittens das gesamte Array. In (name, i) => ... kannst du die Namen frei wählen; ihre Position bestimmt, was sie erhalten. Lass ungenutzte Parameter am Ende weg. Andere Methoden haben andere Signaturen: reduce erhält zusätzlich einen Akkumulator und ein Sortier-Callback erhält zwei zu vergleichende Werte.

Verwende forEach für Aktionen
const letters = ["a", "b"];
const result = letters.forEach((letter, i) => {
  console.log(i + ": " + letter);
});
// Prints "0: a" and "1: b".
// result is undefined.

Die Ausgabe ist ein Seiteneffekt: eine Aktion, die während der Ausführung des Callbacks stattfindet. forEach verwirft die Rückgabewerte des Callbacks und gibt selbst undefined zurück. Verwende map, wenn ein neues Array mit Ergebnissen benötigt wird. Gibt ein forEach-Callback einen Wert zurück, ändert das nichts an dieser Regel.

Ein return in diesem Callback beendet nur den aktuellen Aufruf; die Methode fährt mit dem nächsten Element fort. break kann innerhalb eines Callbacks nicht verwendet werden, um forEach zu verlassen. Wähle for...of mit break oder eine Suchmethode wie find oder some, wenn die weitere Arbeit bei einem Treffer stoppen soll.

Diese Callback-Methoden verändern das ursprüngliche Array nicht selbst. Der Callback kann es dennoch verändern, zum Beispiel durch eine Indexzuweisung oder push. Wenn sich Callbacks auf ihren Rückgabewert oder die beabsichtigte Aktion beschränken, lässt sich leichter nachvollziehen, was das ursprüngliche Array danach enthält.

Wichtige Erkenntnisse

  • Übergib die Callback-Funktion selbst, ohne sie vorher aufzurufen.
  • Ein Ausdrucksrumpf gibt seinen Wert automatisch zurück; ein Blockrumpf braucht return.
  • Die Positionen der Callback-Parameter bestimmen ihre Bedeutung.
  • forEach führt Aktionen aus und gibt undefined zurück.

4.2 Transformiere jeden Wert oder behalte passende Werte

Wähle eine Arraymethode nach der Form des Ergebnisses. map erzeugt für jedes vorhandene Element einen Wert. filter behält die ursprünglichen Elemente, die eine Prüfung bestehen. Beide geben neue Arrays zurück.

Transformiere mit map
const km = [1.5, 3, 0.25];
const meters = km.map(d => d * 1000);
// meters is [1500, 3000, 250]; km is unchanged.

Der Rückgabewert des Callbacks wird zum Element an der entsprechenden Position. Bei einer lückenlosen Eingabe wird der Callback einmal pro Element aufgerufen und das Ergebnis hat dieselbe Länge. Auch das Umwandeln von Zeichenkettenelementen funktioniert: ["ana", "ben"].map(s => s.toUpperCase()) ergibt ["ANA", "BEN"].

Der zweite Callback-Parameter liefert den Index. ["Ana", "Ben"].map((name, i) => (i + 1) + ". " + name) erstellt ["1. Ana", "2. Ben"]. Hat der Callback einen Blockrumpf, gib den zu speichernden Wert ausdrücklich zurück.

Wähle mit filter aus
const temps = [18, 21, 19, 24];
const warm = temps.filter(t => t > 20);
// warm is [21, 24]

filter behält ein Element, wenn der Callback ein Truthy-Ergebnis zurückgibt. Es behält das Element selbst, nicht den booleschen Wert des Callbacks. Die behaltenen Werte bleiben in ihrer ursprünglichen Reihenfolge. Das Ergebnis kann alle, einige oder keine Elemente enthalten; temps.filter(t => t > 30) ist [].

Gib nicht das Element selbst zurück, wenn null ein gültiger Datenwert ist. [0, 5, 0, 3].filter(n => n) verwirft beide Nullen, weil sie falsy sind. Eine Bedingung wie n !== null entfernt fehlende Messwerte, die durch null dargestellt werden, und behält dabei null. Gib die tatsächliche Regel zum Behalten eines Elements an.

Benötigtes ErgebnisMethode
Ein transformierter Wert pro Elementmap
Alle ursprünglichen Elemente, die eine Prüfung bestehenfilter
Einige Elemente, anschließend transformiertfilter gefolgt von map

Wenn du map mit einer Bedingung verwendest, die für abgelehnte Elemente undefined zurückgibt, werden diese nicht entfernt. Die undefined-Ergebnisse belegen weiterhin Positionen im neuen Array.

Lies eine Kette von links nach rechts

[12, 7, 30, 4].filter(n => n >= 10).map(n => n / 2) erstellt zuerst [12, 30], dann [6, 15]. Der zweite Callback erhält nur die behaltenen Elemente. Vor dem Transformieren zu filtern ist passend, wenn sich die Prüfung auf die ursprünglichen Werte bezieht. Eine andere Reihenfolge kann ändern, was die Prüfung sieht.

Wandle Zahlentext gezielt um
const numbers = "4,8,15".split(",").map(Number);
// numbers is [4, 8, 15]

Number erhält jeden Textteil und erzeugt eine Zahl. parseInt direkt zu übergeben ist eine Falle: Sein zweites Argument ist eine Zahlenbasis, während map an dieser Stelle den Index übergibt. ["10", "10", "10"].map(parseInt) ergibt [10, NaN, 2]. Verwende map(s => parseInt(s, 10)), um die Zahlenbasis festzulegen, oder map(Number) für diese ganzzahligen Zeichenketten.

Weder map noch filter ersetzt das Original. temps.map(t => t + 1); allein verwirft das neu berechnete Array. Speichere es, gib es aus einer Funktion zurück oder verwende es in einer Kette.

Wichtige Erkenntnisse

  • map gibt transformierte Werte in einem neuen Array derselben Länge zurück.
  • filter gibt passende ursprüngliche Elemente in ihrer bisherigen Reihenfolge zurück.
  • Eine Filterprüfung muss die beabsichtigte Regel ausdrücken, damit gültige Nullen erhalten bleiben.
  • Verkettete Callbacks arbeiten mit dem Ergebnis der jeweils vorherigen Methode.
  • Verwende Number oder einen Wrapper mit einem Argument statt map(parseInt).
  • Speichere oder verwende das neue Array; das Original bleibt unverändert.

4.3 Finde einen Treffer und prüfe auf mindestens einen oder alle

Manche Fragen benötigen einen Wert, andere eine Position oder eine Ja-Nein-Antwort. Suchmethoden können stoppen, sobald diese Antwort bekannt ist. Der passende Rückgabetyp erleichtert es, spätere Bedingungen richtig zu schreiben.

Wähle einen Wert oder einen Index
const temps = [18, 21, 19, 24];
console.log(temps.find(t => t > 20)); // 21
console.log(temps.findIndex(t => t > 20)); // 1
console.log(temps.findLast(t => t > 20)); // 24
console.log(temps.findLastIndex(t => t > 20)); // 3

find sucht vom Anfang aus und gibt das erste passende Element zurück. findIndex gibt dessen Index zurück. Die Varianten mit Last suchen rückwärts. Alle vier stoppen, wenn sie den gesuchten Treffer finden.

MethodeErgebnis bei TrefferErgebnis ohne Treffer
find, findLastElementundefined
findIndex, findLastIndexIndex-1
filterArray aller Treffer[]

temps.find(t => t > 30) gibt undefined zurück; temps.findIndex(t => t > 30) gibt -1 zurück. Prüfe i !== -1, bevor du einen gefundenen Index an splice übergibst. Andernfalls entfernt splice(-1, 1) das letzte Element, obwohl kein Treffer gefunden wurde.

Berücksichtige Falsy-Treffer

[3, 0, 5].find(n => n < 1) gibt 0 zurück, einen erfolgreichen Treffer. if (result) behandelt ihn fälschlich als Fehlschlag, weil null falsy ist. Bei numerischen Daten unterscheidet result !== undefined null von einem fehlenden Treffer. Kann ein Array selbst undefined als passenden Wert enthalten, verwende findIndex und vergleiche das Ergebnis mit -1; der Wert allein kann diese Fälle nicht unterscheiden.

filter ist passend, wenn alle Treffer benötigt werden. [5, 12, 8, 130].filter(n => n > 10) ergibt [12, 130]; find gibt nur 12 zurück. Bei filter(...)[0] wird das gesamte Array der Treffer berechnet, bevor sein erster Wert gelesen wird.

Prüfe auf mindestens eines oder alle
const scores = [72, 85, 49];
const anyFailed = scores.some(s => s < 50); // true
const allPassed = scores.every(s => s >= 50); // false

some stoppt beim ersten Erfolg. every stoppt beim ersten Fehlschlag. Ihre Antworten sind boolesche Werte, keine Elemente. In diesen Aufrufen führt die 49 bei some zum Erfolg und bei every zum Fehlschlag.

Bei einem leeren Array gibt some false zurück, weil nichts die Prüfung besteht. every gibt true zurück, weil nichts durchfällt. Muss eine vollständige Reihe von Ergebnissen mindestens eine Punktzahl enthalten, kombiniere die Prüfungen: scores.length > 0 && scores.every(s => s >= 50). Die Längenbedingung prüft auf eine leere Liste; every prüft die Elemente.

Wähle zwischen exakter Zugehörigkeit und eigener Prüfung

includes("ana") sucht nach genau diesem Wert. Eine Suche ohne Beachtung der Groß- und Kleinschreibung braucht einen Callback: names.some(n => n.toLowerCase() === "ana"). Dies kann sowohl „Ana“ als auch „ANA“ akzeptieren. Verwende includes für einen bekannten Wert und eine Callback-Suche, wenn jedes Element nach einer Regel geprüft werden muss.

Wichtige Erkenntnisse

  • Wähle Wert, Index, Array oder booleschen Wert passend zum benötigten Ergebnis.
  • findLast und findLastIndex suchen vom Ende aus.
  • Prüfe einen Index auf -1, bevor du ihn zum Bearbeiten eines Arrays verwendest.
  • Ein Falsy-Element wie 0 kann ein echter Treffer sein.
  • some stoppt bei einem Erfolg; every stoppt bei einem Fehlschlag.
  • Leere Arrays ergeben false für some und true für every.

4.4 Führe ein Ergebnis durch reduce

reduce trägt einen Akkumulator von einem Element zum nächsten. Sein Callback gibt den Akkumulator für den folgenden Schritt zurück. Nach dem letzten Element gibt die Methode diesen endgültigen Wert zurück.

Verfolge eine Summe
const temps = [18, 21, 19, 24];
const total = temps.reduce((sum, t) => sum + t, 0);
// total is 82

Die 0 ist der anfängliche Akkumulator. Der Callback erhält zuerst sum und zweitens die aktuelle Temperatur t. Die zurückgegebene Summe wird zum ersten Argument des nächsten Aufrufs.

Akkumulator vorherElementZurückgegebener Akkumulator
01818
182139
391958
582482

Dies ist dieselbe laufende Summe wie bei einer Schleife mit let sum = 0. Ein Callback erhält nach Akkumulator und Element optional auch Index und Array als Argumente. Die Parameternamen sind frei wählbar, ihre Reihenfolge ist jedoch festgelegt.

Gib einen geeigneten Anfangswert an

Mit einem Anfangswert beginnt die Reduktion beim ersten Element. Ohne Anfangswert wird das erste vorhandene Element zum Akkumulator und die Callback-Aufrufe beginnen beim nächsten vorhandenen Element. Bei einem leeren Array löst das Weglassen des Anfangswerts einen TypeError aus. [].reduce((sum, n) => sum + n, 0) gibt zuverlässig 0 zurück, weil kein Callback-Aufruf nötig ist.

Der Anfangswert legt auch die Art des Ergebnisses fest. Verwende 0 für Summen oder Anzahlen und "" für Text. ["a", "b", "c"].reduce((text, s) => text + s.toUpperCase(), "") erstellt „ABC“. Beginnt eine numerische Summe mit einer Zeichenkette, kann + versehentlich Text verketten.

Zähle und finde einen Extremwert
const scores = [72, 85, 49];
const passed = scores.reduce(
  (count, s) => s >= 50 ? count + 1 : count,
  0
);
// passed is 2

Bei Bestehen wird eins addiert; bei Nichtbestehen wird die unveränderte Anzahl zurückgegeben. Jeder Ausführungszweig liefert einen nächsten Akkumulator. Gib für ein Maximum den größeren Wert zurück: [-3, -7, -1, -5].reduce((max, n) => n > max ? n : max, -Infinity) ergibt -1. Ein Start bei null wäre für diese Liste ausschließlich negativer Werte falsch. Bei leerer Eingabe bleibt -Infinity stehen; behandle dieses Ergebnis, wenn ein tatsächliches Maximum benötigt wird.

Gib auf jedem Pfad einen Wert zurück

Ein Block-Callback braucht return. (sum, n) => { sum + n; } gibt undefined zurück, sodass das endgültige Ergebnis der Reduktion undefined ist. Ein teilweise fehlendes return ist ebenfalls gefährlich. Wird beim Zählen über [72, 49, 85] nur bei Bestehen ein Wert zurückgegeben, ergibt sich zuerst 1, dann undefined bei 49 und schließlich NaN, wenn bei 85 eins addiert wird. Gib den unveränderten Akkumulator zurück, wenn ein Element nichts beiträgt.

Kombiniere Operationen, ohne die Aufgabe zu verschleiern

Die Summe der bestandenen Punktzahlen ist scores.filter(s => s >= 50).reduce((sum, s) => sum + s, 0), was 157 ergibt. Für einen Durchschnitt brauchst du eine separate Anzahl: temps.reduce((sum, t) => sum + t, 0) / temps.length ergibt 20,5 °C. Prüfe zuerst die Länge, weil eine leere Eingabe nach der Division NaN ergibt. Wenn ein Callback mehrere Aufgaben ohne Bezug zueinander übernimmt, kann eine for...of-Schleife die veränderlichen Ergebnisse deutlicher zeigen.

Wichtige Erkenntnisse

  • reduce übergibt zuerst den Akkumulator und dann das Element.
  • Der Callback muss auf jedem Pfad den nächsten Akkumulator zurückgeben.
  • Ein ausdrücklicher Anfangswert macht das Verhalten bei leerer Eingabe vorhersehbar.
  • Wähle den Anfangswert passend zum Ergebnis: Summe, Anzahl, Text oder Extremwert.
  • Ein Durchschnitt benötigt sowohl eine Summe als auch eine Anzahl ungleich null.
5

Sortiere, kopiere und kombiniere Arrays

Eine Liste zu sortieren und sie zu kopieren sind getrennte Entscheidungen. Eine numerische Sortierung braucht andere Vergleichsregeln als eine Namensliste und die Sprache beeinflusst die von Lesern erwartete Reihenfolge. Entscheide, ob die ursprüngliche Folge erhalten bleiben muss, bevor du eine verändernde oder kopierende Methode wählst. Referenzen und flache Kopien erklären, welche späteren Änderungen lokal bleiben und welche über einen anderen Arraynamen sichtbar sind.

5.1 Sortiere Zahlen und erhalte das Original

Beim Sortieren wird durch den Vergleich von Elementen eine Reihenfolge gewählt. Das Umkehren dreht lediglich die vorhandene Reihenfolge um. Für beide Operationen gibt es Methoden, die ein Array bearbeiten, und Methoden, die eine Kopie erstellen.

Verstehe die Standardreihenfolge

[10, 9, 1, 100].sort() ergibt [1, 10, 100, 9]. Ohne Vergleichsfunktion vergleicht sort die Elemente als Zeichenketten, Zeichen für Zeichen anhand von UTF-16-Codeeinheiten. „100“ beginnt mit „1“, das vor „9“ steht. Die gespeicherten Elemente bleiben Zahlen; nur für den Vergleich wird ihre Textform verwendet.

Auch bei Zeichenketten kann diese Standardeinstellung Leser überraschen. ["banana", "Cherry", "apple"].sort() ergibt ["Cherry", "apple", "banana"], weil ASCII-Großbuchstaben vor Kleinbuchstaben stehen. Buchstaben mit Akzent können von den Buchstaben getrennt werden, denen Leser sie zuordnen. Verwende für eine für Menschen übliche alphabetische Reihenfolge einen sprachgerechten Vergleich.

Gib das richtige Vorzeichen zurück

Eine Vergleichsfunktion erhält zwei Elemente, a und b. Ein negativer Rückgabewert setzt a vor b; ein positiver setzt es nach b; null behandelt beide beim Sortieren als gleich.

const nums = [10, 9, 1, 100];
nums.sort((a, b) => a - b);
// nums is [1, 9, 10, 100]

Der Vergleich von 10 mit 9 ergibt die positive Zahl 1, also steht 9 vor 10. Verwende für eine absteigende numerische Reihenfolge (a, b) => b - a. Gib eine Zahl mit aussagekräftigem Vorzeichen zurück. (a, b) => a > b gibt nur true oder false zurück, die zu 1 oder 0 werden; die Funktion meldet nie, dass a vor b gehört. Eine solche Vergleichsfunktion liefert eine unzuverlässige Reihenfolge.

Die Sortierung ist stabil: Elemente, die beim Vergleich als gleich gelten, behalten ihre ursprüngliche relative Reihenfolge. ["kiwi", "fig", "pear", "plum"].sort((a, b) => a.length - b.length) ergibt ["fig", "kiwi", "pear", "plum"]. Die drei Wörter mit vier Buchstaben behalten ihre Reihenfolge.

Wähle zwischen Mutation und Kopie
MethodeAuswirkung auf das OriginalZurückgegebenes Array
sort(compare)Sortiert das Original direktDasselbe Array
toSorted(compare)Lässt das Original unverändertNeues sortiertes Array
reverse()Kehrt das Original direkt umDasselbe Array
toReversed()Lässt das Original unverändertNeues Array in umgekehrter Reihenfolge

const sorted = scores.sort((a, b) => a - b); gibt demselben nun sortierten Array einen zweiten Namen. Die frühere Reihenfolge bleibt nicht erhalten. Verwende für ein neues sortiertes Array scores.toSorted((a, b) => a - b) oder erstelle vor sort eine Spread-Kopie.

[3, 1, 2].toReversed() ergibt [2, 1, 3]. Das ist eine umgekehrte Folge, keine absteigende numerische Reihenfolge. Um die größten Werte zuerst zu setzen, verwende eine absteigende Vergleichsfunktion oder sortiere vor dem Umkehren aufsteigend.

Prüfe Typen vor dem Sortieren von Zahlentext

Werte aus split sind Zeichenketten. ["10", "9", "100"].sort() ergibt ["10", "100", "9"]. Eine Subtraktion in einer Vergleichsfunktion wandelt numerische Zeichenketten beim Vergleich um, lässt die Elemente aber als Zeichenketten bestehen. Wandle zuerst mit map(Number) um, wenn die Werte numerische Daten sind, und verwende dann eine numerische Vergleichsfunktion. Das bereitet die Daten auch auf spätere Additionen vor, ohne versehentlich Text zu verketten.

Wichtige Erkenntnisse

  • Die Standardsortierung vergleicht Text, auch bei numerischen Elementen.
  • Verwende a - b für aufsteigende und b - a für absteigende Zahlen.
  • Eine Vergleichsfunktion gibt eine negative Zahl, null oder eine positive Zahl zurück.
  • Bei gleichen Vergleichsergebnissen bleibt die relative Reihenfolge erhalten.
  • sort und reverse verändern das Array; toSorted und toReversed kopieren es.
  • Das Umkehren der aktuellen Reihenfolge sortiert sie nicht unbedingt.

5.2 Ordne und formatiere Daten für die Leser

Menschen erwarten, dass Textreihenfolge und Zahlenformatierung den Konventionen einer Sprache folgen. Halte Werte in leicht verarbeitbaren Formen, wähle für den Textvergleich ein ausdrückliches Gebietsschema und formatiere die endgültige Ausgabe für die Leser.

Vergleiche Text nach den Regeln eines Gebietsschemas

a.localeCompare(b, locale) gibt eine negative Zahl zurück, wenn a vor b steht, eine positive Zahl, wenn es danach steht, und null, wenn beide beim Vergleich gleich sind. Garantiert ist nur das Vorzeichen, nicht genau -1 oder 1.

const names = ["Zoe", "Émile", "adam"];
const sorted = names.toSorted((a, b) => a.localeCompare(b, "en"));
// sorted is ["adam", "Émile", "Zoe"]

Ein Gebietsschema wird durch ein Sprachkürzel wie „en“, „de“ oder „sv“ angegeben. Im Deutschen steht „ä“ vor „z“, im Schwedischen dagegen nach „z“. Übergib die vorgesehene Sprache der Seite, um diese Wahl ausdrücklich zu treffen. Ohne Gebietsschema entscheiden die Standardeinstellungen der Laufzeitumgebung über die Reihenfolge.

Einfache <-Vergleiche vergleichen weiterhin Zeichencodes. Das Subtrahieren von Wörtern erzeugt NaN, was beim Sortieren wie ein Vergleich auf Gleichheit wirkt; es erzeugt keine alphabetische Reihenfolge.

Setze geeignete Vergleichsoptionen

Mit { numeric: true } werden Ziffernfolgen numerisch verglichen. Die Sortierung von ["file10", "file2", "file1"] mit (a, b) => a.localeCompare(b, "en", { numeric: true }) ergibt ["file1", "file2", "file10"]. Eine einfache Textsortierung setzt „file10“ vor „file2“.

Im Englischen behandelt { sensitivity: "base" } Varianten hinsichtlich Groß- und Kleinschreibung und Akzenten wie „a“, „A“ und „á“ als gleich. Diese Regeln hängen von der Sprache ab: Im Schwedischen gelten „a“ und „ä“ als unterschiedliche Grundbuchstaben. Verwende sowohl beim Abgleich als auch beim Sortieren das vorgesehene Gebietsschema.

Verwende für viele Vergleiche einen Collator wieder:

const collator = new Intl.Collator("en", { numeric: true });
const sorted = files.toSorted(collator.compare);

collator.compare ist bereits eine Vergleichsfunktion. Ihn einmal zu erstellen vermeidet, dieselben Optionen für das Gebietsschema bei einer großen Sortierung wiederholt einzurichten.

Sortiere Datumsangaben vor dem Formatieren

Zeichenketten im Format YYYY-MM-DD mit festen Stellenzahlen setzen das Jahr vor den Monat und den Tag. Die Textsortierung folgt dann der Datumsreihenfolge: ["2026-03-15", "2025-11-02", "2026-01-20"].sort() ergibt ["2025-11-02", "2026-01-20", "2026-03-15"].

Bei Text mit dem Tag an erster Stelle wie „15/03/2026“ und „20/01/2025“ wird zuerst der Tag verglichen, sodass das spätere Jahr zuerst stehen kann. Speichere und sortiere diese Datumsangaben im ISO-Format und erstelle den Anzeigetext erst am Ende.

Erstelle lesbare Listen und Zahlen

join(", ") verwendet überall dasselbe Trennzeichen. Intl.ListFormat fügt das abschließende Verbindungswort der Sprache hinzu:

const list = new Intl.ListFormat("en-US", {
  style: "long", type: "conjunction"
});
list.format(["Ana", "Ben", "Cleo"]);
// "Ana, Ben, and Cleo"

„en-GB“ erzeugt „Ana, Ben and Cleo“; „nl“ erzeugt „Ana, Ben en Cleo“. Eine Disjunktion verwendet im Englischen „or“. Zwei Namen ergeben „Ana and Ben“ ohne Komma.

(1234.5).toLocaleString("en-US") ergibt „1,234.5“, während „de-DE“ „1.234,5“ ergibt. Diese Ergebnisse sind Zeichenketten. Sortiere numerische Daten, bevor du toLocaleString mit map anwendest; eine vorherige Formatierung ersetzt Zahlenwerte durch Text, dessen Satzzeichen die Textsortierung beeinflussen.

Wichtige Erkenntnisse

  • Verwende localeCompare oder einen wiederverwendbaren Intl.Collator für eine sprachgerechte Reihenfolge.
  • Verwende das Vorzeichen des Vergleichsergebnisses, nicht genau -1 oder 1.
  • numeric: true ordnet Ziffernfolgen innerhalb von Namen auf natürliche Weise.
  • ISO-Datumszeichenketten mit festen Stellenzahlen werden als Text chronologisch sortiert.
  • Intl.ListFormat fügt ein zur Sprache passendes Verbindungswort hinzu.
  • Sortiere Zahlen zuerst und formatiere sie zuletzt.

5.3 Kopiere Arrays, ohne Änderungen versehentlich gemeinsam zu nutzen

Eine Arrayvariable enthält eine Referenz auf ein Array. Weist du diese Variable einem anderen Namen zu, wird das Array gemeinsam genutzt. Die Spread-Syntax kann ein neues äußeres Array erstellen, Listen kombinieren oder Elemente als separate Funktionsargumente übergeben.

Unterscheide Zuweisung und Kopieren
const a = [1, 2, 3];
const b = a;
b.push(4);
// a and b both refer to [1, 2, 3, 4].
console.log(a === b); // true

Es gibt ein Array mit zwei Namen. const verhindert nicht, dass einer der Namen verwendet wird, um es zu verändern. Für ein neues äußeres Array ist eine tatsächliche Kopieroperation nötig:

const c = [...a];
c.push(5);
// c is [1, 2, 3, 4, 5]; a stays [1, 2, 3, 4].
console.log(c === a); // false

Die drei Punkte breiten die Elemente von a innerhalb eines neuen Arrayliterals aus. Ohne sie entsteht ein anderes Ergebnis: [a] erstellt ein Array mit einem Element, dem gesamten Array a. [...a] enthält die Elemente von a einzeln.

Kombiniere und füge ein

[...[1, 2], ...[3, 4]] ergibt [1, 2, 3, 4], ebenso wie [1, 2].concat([3, 4]). [...first, 99, ...second] setzt ein zusätzliches Element zwischen zwei Listen. [...list, "new"] erstellt ein erweitertes Array, während list.push("new") das bestehende bearbeitet. Spread erhält die Reihenfolge der Elemente jeder Eingabe.

Erkenne eine flache Kopie
const grid = [[1, 2], [3, 4]];
const copy = [...grid];
copy[0].push(9);
// grid[0] and copy[0] are both [1, 2, 9].

Die äußeren Arrays sind verschieden, aber ihre Zeilenelemente verweisen weiterhin auf dieselben inneren Arrays. Das ist eine flache Kopie. Würdest du copy[0] durch eine neue Zeile ersetzen, würde sich nur das kopierte äußere Array ändern; veränderst du die bestehende Zeile, änderst du die gemeinsam genutzte Zeile. structuredClone(grid) erstellt eine unabhängige tiefe Kopie dieser verschachtelten Arrays.

Breite Werte in einem Aufruf aus

Math.max(...[3, 9, 4]) übergibt drei separate Argumente und gibt 9 zurück. Die direkte Übergabe des Arrays, Math.max([3, 9, 4]), übergibt ein Array und ergibt NaN. Leeres Spread ergibt Math.max(...[]) === -Infinity und Math.min(...[]) === Infinity.

Sehr große Arrays können die Argumentgrenze einer Engine überschreiten, wenn sie in einem Aufruf ausgebreitet werden. Es gibt keine allgemein sichere Elementanzahl. Verwende bei einer großen Eingabe eine Schleife oder reduce, um einen Extremwert zu finden. Spread in einem Arrayliteral erstellt keine Liste von Funktionsargumenten.

Breite Zeichenketten aus und aktualisiere Kopien

[..."hello"] erzeugt fünf Zeichenketten mit je einem Buchstaben. Spread durchläuft bei Zeichenketten Unicode-Codepunkte: [..."a😀"] hat zwei Elemente, während "a😀".split("") drei UTF-16-Codeeinheiten hat. Manche sichtbaren Symbole kombinieren mehrere Codepunkte, daher zählt Spread sichtbare Zeichen nicht allgemein zuverlässig. Eine Zahl ist nicht iterierbar; [...5] löst einen TypeError aus.

In einer Parameterliste verwendet function total(...nums) Rest, um Argumente in einem Array zu sammeln. Spread in einem Aufruf tut das Gegenteil: Es übergibt separate Argumente.

Für Aktualisierungen mittels Kopien ergibt [10, 20, 30].with(1, 25) den Wert [10, 25, 30] und .toSpliced(1, 1) den Wert [10, 30]. Auch toSorted und toReversed erhalten das Original. Dies sind flache Kopien, daher gilt dieselbe Regel zur gemeinsamen Nutzung innerer Arrays.

Wichtige Erkenntnisse

  • Eine Zuweisung führt zur gemeinsamen Nutzung eines Arrays; Spread in einem Arrayliteral erstellt ein neues äußeres Array.
  • Ohne Spread wird ein Array als ein Element verschachtelt.
  • Spread kann Arrays kombinieren und zusätzliche Elemente einfügen, ohne die Arrays zu verändern.
  • Eine flache Kopie nutzt innere Arrays weiterhin gemeinsam; structuredClone erstellt tiefe Kopien dieser verschachtelten Arrays.
  • Spread in einem Aufruf übergibt separate Argumente und ist für unbegrenzte Eingabegrößen ungeeignet.
  • Spread durchläuft bei Zeichenketten Codepunkte; Restparameter sammeln Argumente.
  • with und toSpliced erstellen veränderte Kopien.

Schleifen und Arrays in JavaScript: Beispiele

5 Interaktive Lektionen

1

Verfolge eine Schleife von der ersten Prüfung bis zum Ausstieg

12 Schritte
Verfolge einen Zähler und eine laufende Summe, vergleiche vorab und nachträglich geprüfte Schleifen und steuere anschließend eine verschachtelte Suche.
  1. 1
    EinführungVerfolge, was sich ändert

    Eine Schleife wiederholt einen Rumpf, aber ihr Ergebnis hängt von der Reihenfolge der Prüfungen und Änderungen ab. Wir verfolgen eine kleine Summe einen Schleifendurchlauf nach dem anderen, wählen dann eine bedingungsgesteuerte Schleife (while prüft zuerst, do...while nach einer Ausführung) und steuern eine verschachtelte Suche mit break und continue, um sie zu verlassen oder etwas zu überspringen.

    Halte zwei Fragen auseinander: Welcher Wert erreicht den Rumpf und welcher Wert lässt die nächste Prüfung fehlschlagen? Die letzte fehlgeschlagene Prüfung gehört zum Steuerungsablauf, obwohl sie keine Arbeit im Rumpf ausführt.

  2. 2
    BeispielRichte eine laufende Summe ein

    Wir möchten die Summe von 2, 4 und 6 bilden. Der Zähler wählt jede Zahl, während ein separater Akkumulator ihre Summe speichert.

    let total = 0;
    for (let n = 2; n <= 6; n += 2) {
      total += n;
    }
    

    Die Initialisierung setzt n einmal auf 2. Die erste Prüfung, 2 <= 6, ist erfolgreich. Die erste Ausführung des Rumpfs addiert zwei zu null, sodass total den Wert 2 enthält. Die Aktualisierung ändert n dann zu 4.

  3. 3
    BeispielVerfolge die übrigen Prüfungen

    Die nächste Prüfung akzeptiert 4, sodass die Summe 2 + 4, also 6, wird. Die Aktualisierung setzt den Zähler auf 6, was n <= 6 noch erfüllt. Die Addition dieses letzten Werts macht die Summe zu 12.

    Danach ändert die Aktualisierung n zu 8. Nun ist 8 <= 6 falsch und die Schleife stoppt. Der Rumpf wurde dreimal ausgeführt und die Bedingung viermal geprüft. Acht wurde nicht zur Summe addiert.

  4. 4
    HerausforderungÄndere einen Endpunkt

    Wenn die obige Schleife n < 6 statt n <= 6 verwenden würde, wie hoch wäre ihre endgültige Summe und warum?

    ---reveal---

    Die Summe wäre 6: Nur 2 und 4 erreichen den Rumpf. Bei n = 6 ist die Bedingung bereits falsch, sodass sechs nie addiert wird. Die Aktualisierung erreicht zwar sechs, aber ein im Kopf erreichter Wert garantiert keinen Schleifendurchlauf mit diesem Wert.

  5. 5
    ErklärungLass ein Ergebnis über den Abbruch entscheiden

    Angenommen, eine Losgröße beginnt bei 5 und verdoppelt sich, bis sie mindestens 30 erreicht. Eine while-Schleife kann die noch ausstehende Arbeit direkt ausdrücken.

    let size = 5;
    let rounds = 0;
    while (size < 30) {
      size *= 2;
      rounds++;
    }
    

    Die Größen werden zu 10, 20 und 40. Die Schleife endet nach drei Runden, weil vierzig die erste erreichte Größe ist, bei der eine weitere Verdopplung nicht nötig ist.

  6. 6
    KernaussageEntscheide, ob eine erste Ausführung nötig ist

    Eine while-Schleife prüft, bevor sie etwas ausführt. Ist die Anfangsgröße bereits 40, läuft die vorherige Schleife keinmal durch. Eine do...while-Schleife würde sie einmal verdoppeln, bevor sie feststellt, dass ein weiterer Durchlauf nicht nötig ist.

    Verwende diese nachträgliche Prüfung, wenn eine Ausführung zur Aufgabe gehört. Beim Zählen von Ziffern durch das Entfernen jeweils einer Ziffer muss null als einstellige Zahl gezählt werden, sodass eine erste Ausführung des Rumpfs nützlich ist.

  7. 7
    HerausforderungLies eine nachträglich geprüfte Schleife

    Welche Werte haben n und runs nach diesem Code?

    let n = 1;
    let runs = 0;
    do {
      n *= 3;
      runs++;
    } while (n < 8);
    

    ---reveal---

    n ist 9 und runs ist 2. Der erste Rumpfdurchlauf ergibt drei und die Prüfung ist erfolgreich. Der zweite ergibt neun und seine Prüfung schlägt fehl. Die Prüfung findet nach jeder Multiplikation statt, sodass der endgültige Wert die Schranke überschreiten kann.

  8. 8
    BeispielÜberspringe einen Wert, ohne die Schleife zu beenden

    Diese Schleife gibt nur die erlaubten Zählerwerte aus.

    for (let n = 1; n <= 5; n++) {
      if (n === 3) continue;
      console.log(n);
    }
    

    Sie gibt 1, 2, 4, 5 aus. Bei drei überspringt continue die Ausgabe, aber die Aktualisierung im Kopf geht trotzdem zu vier weiter. Mit break würde stattdessen die ganze Schleife bei drei stoppen und kein späterer Wert ausgegeben.

  9. 9
    HerausforderungFinde eine übersprungene Aktualisierung

    Warum kommt dieser Code bei n = 2 nicht weiter?

    let n = 0;
    while (n < 4) {
      if (n === 2) continue;
      n++;
    }
    

    ---reveal---

    Continue springt direkt zur while-Bedingung und überspringt n++. Bei zwei ist jede spätere Prüfung wahr und jeder Rumpfdurchlauf überspringt die Aktualisierung erneut. Erhöhe den Wert in diesem Ausführungszweig vor dem Fortsetzen oder verwende eine for-Schleife, deren Kopf die Aktualisierung vornimmt.

  10. 10
    BeispielVerfolge eine innere Suche

    Für jeden äußeren Wert beginnt eine innere Schleife von vorn.

    for (let a = 1; a <= 3; a++) {
      for (let b = 1; b <= 4; b++) {
        if (a * b === 6) break;
        console.log(a, b);
      }
    }
    

    Bei a = 2 beendet das Erreichen von b = 3 diese innere Schleife, bevor das Paar ausgegeben wird. Die äußere Schleife geht dennoch zu drei weiter. Ein gewöhnliches break steuert nur die innerste Schleife.

  11. 11
    HerausforderungBeende die gesamte verschachtelte Suche

    Die verschachtelte Suche soll beim ersten Produkt mit dem Wert sechs vollständig stoppen. Welche Änderung erreicht das und welches Paar löst sie aus?

    ---reveal---

    Gib der äußeren Schleife die Marke outer: und ersetze break durch break outer;. Das erste passende Paar ist a = 2, b = 3: Zeile eins hat kein Produkt mit dem Wert sechs, dann erreicht Zeile zwei es in ihrer dritten Spalte. Beide Schleifen enden an diesem Punkt, sodass Zeile drei nie durchläuft.

  12. 12
    ZusammenfassungLies den Steuerungsablauf

    Verfolge die einmalige Initialisierung und dann jede Bedingung, den Rumpf und die Aktualisierung der Reihe nach. Zähle nur erfolgreiche Eintritte in den Rumpf als Schleifendurchläufe.

    Eine while-Schleife kann den Rumpf vollständig überspringen; eine do...while-Schleife nicht. Continue ermöglicht weiterhin den nächsten Schleifendurchlauf, kann aber eine Aktualisierung in einer while-Schleife umgehen. Break beendet seine Schleife und eine Schleifenmarke kann diesen Ausstieg auf eine äußere Suche ausdehnen. Bestimme in jedem Fall, welche Anweisung die Ausführung als Nächstes erreicht.

2

Verfolge ein Array und jedes Methodenergebnis

11 Schritte
Lies indizierte Daten, verfolge eine Einfügung und Entfernung und wandle dann eine durchsuchte Liste in Anzeigetext um.

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

  1. 1
    EinführungVerfolge zwei Ergebnisse einer Bearbeitung
  2. 2
    BeispielOrdne Werte den Indizes zu
  3. 3
    HerausforderungLies einen verschachtelten Plan
  4. 4
    BeispielFüge eine Aufgabe hinzu und behalte den Rückgabewert
  5. 5
    BeispielErsetze eine Aufgabe mit splice
  6. 6
    HerausforderungKopiere einen Ausschnitt
  7. 7
    ErklärungSuche ausdrücklich nach einer Position
  8. 8
    HerausforderungZerlege Text und füge ihn zusammen
  9. 9
    KernaussageHalte Zahlentext und Zahlen auseinander
  10. 10
    HerausforderungSuche vor dem Entfernen
  11. 11
    ZusammenfassungHalte Positionen, Bearbeitungen und Text auseinander
3

Erzeuge mit einer Schleife ein nützliches Ergebnis

10 Schritte
Wähle eine Art des Durchlaufens, berechne eine Summe und eine Anzahl und bilde dann Veränderungen zwischen benachbarten Messwerten.

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

  1. 1
    EinführungWähle, was der Rumpf braucht
  2. 2
    ErklärungLies Werte direkt
  3. 3
    HerausforderungBesuche jede zweite Position
  4. 4
    BeispielBilde eine Summe und zähle lange Fahrten
  5. 5
    BeispielVerwende die fertige Summe
  6. 6
    HerausforderungFinde einen Extremwert, ohne null zu erfinden
  7. 7
    BeispielBilde Differenzen benachbarter Werte
  8. 8
    HerausforderungBehalte nur Zunahmen
  9. 9
    TippEntferne vom Ende aus, wenn sich Indizes verschieben
  10. 10
    ZusammenfassungWähle für jedes Ergebnis einen Anfangswert
4

Verfolge eine Abfolge von Callbacks

15 Schritte
Gib Werte aus Callbacks zurück, wähle Messwerte aus und transformiere sie, durchsuche sie und verfolge eine Reduktion.

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

  1. 1
    EinführungLass die Methode die Besuche steuern
  2. 2
    ErklärungGib einen Ausdruck oder ein Blockergebnis zurück
  3. 3
    HerausforderungWähle eine Methode für die Ausgabe
  4. 4
    BeispielBehalte ausgewählte Messwerte
  5. 5
    BeispielTransformiere die ausgewählten Werte
  6. 6
    HerausforderungBehalte gültige Nullen
  7. 7
    ErklärungSuche einen Wert oder seine Position
  8. 8
    HerausforderungErkenne einen Treffer mit null
  9. 9
    KernaussagePrüfungen auf mindestens eines und alle enden zu unterschiedlichen Zeitpunkten
  10. 10
    BeispielBeginne eine Reduktion mit einem ausdrücklichen Wert
  11. 11
    TippHalte auf jedem Pfad einen nächsten Akkumulator bereit
  12. 12
    HerausforderungVerfolge eine gefilterte Summe
  13. 13
    HerausforderungUntersuche einen Umwandlungs-Callback
  14. 14
    HerausforderungWähle alle Treffer oder einen Treffer
  15. 15
    ZusammenfassungLies jede Form des Rückgabewerts
5

Erhalte Daten beim Ordnen und Formatieren

13 Schritte
Wähle Vergleichsregeln, sortiere numerische Daten vor dem Formatieren und verfolge das Verhalten flacher Kopien.

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

  1. 1
    EinführungTriff getrennte Entscheidungen über Reihenfolge und Identität
  2. 2
    BeispielPrüfe die Standardreihenfolge
  3. 3
    ErklärungNutze das Vorzeichen der Vergleichsfunktion
  4. 4
    HerausforderungErhalte die ursprüngliche Reihenfolge
  5. 5
    BeispielLass die Sprache über die Textreihenfolge entscheiden
  6. 6
    HerausforderungOrdne nummerierte Bezeichnungen
  7. 7
    VerbindungSchließe Berechnungen vor der Anzeige ab
  8. 8
    BeispielGib demselben Array einen zweiten Namen
  9. 9
    BeispielKopiere die äußere Liste
  10. 10
    HerausforderungFinde eine gemeinsam genutzte innere Zeile
  11. 11
    TippÜbergib Argumente, ohne einen riesigen Aufruf zu erzeugen
  12. 12
    HerausforderungKombiniere Sortierung, Kopie und Formatierung
  13. 13
    ZusammenfassungVerfolge, was gemeinsam genutzt und was zurückgegeben wird

Schleifen und Arrays in JavaScript: Übungsaufgaben

40 Übungsfragen in 4 Sets

Set 1: Verfolge Schleifen und lies Arraypositionen10 Übungsfragen

Frage 1 von 10

Wie oft wird dieser Schleifenrumpf ausgeführt?

for (let i = 2; i < 7; i++) {
  console.log(i);
}
  1. 4-mal
  2. 6-mal
  3. 5-mal
  4. 7-mal
Antwort zeigenAntwort ausblenden
Antwort: C
Der Rumpf wird bei den Zählerwerten 2, 3, 4, 5 und 6 ausgeführt, also fünfmal. Bei 7 ist die Bedingung falsch, bevor der Rumpf ausgeführt werden kann. Sechs Schleifendurchläufe würden diese fehlgeschlagene Prüfung so zählen, als wäre sie eine weitere Ausführung des Rumpfs.

Frage 2 von 10

Was gibt ["oak", "pine", "elm", "fir"].at(-2) zurück?
  1. "elm"
  2. "pine"
  3. "fir"
  4. undefined
Antwort zeigenAntwort ausblenden
Antwort: A
Ein negativer Index in at zählt rückwärts: -1 ist das letzte Element „fir“ und -2 ist „elm“. „pine“ steht am positiven Index 1; wer den negativen Index als gewöhnliche positive Position behandelt, wählt das falsche Ende der Liste.

Frage 3 von 10

Welcher Wert wird ausgegeben?

let n = 8;
do {
  n -= 3;
} while (n > 6);
console.log(n);
  1. 8
  2. 2
  3. 6
  4. 5
Antwort zeigenAntwort ausblenden
Antwort: D
Der Rumpf wird vor der ersten Prüfung ausgeführt und subtrahiert drei von acht, sodass fünf übrig bleibt. Die Bedingung 5 > 6 ist dann falsch, also stoppt die Ausführung. Acht wäre das Ergebnis, wenn die Schleife fälschlich als vorab geprüfte while-Schleife behandelt würde, in deren Rumpf nie eingetreten wird.

Frage 4 von 10

Welchen Wert enthält total danach?

let total = 0;
for (let n = 3; n <= 9; n += 3) {
  total += n;
}
  1. 9
  2. 18
  3. 12
  4. 15
Antwort zeigenAntwort ausblenden
Antwort: B
Der Zähler besucht 3, 6 und 9; die Summe wird zu 3, dann 9 und dann 18. Die Bedingung <= schließt die letzte neun ein. Eine Summe von neun addiert nur die ersten beiden besuchten Werte und lässt den Endpunkt aus, statt alle drei Beiträge zu berücksichtigen.

Frage 5 von 10

Welche Zahlen werden in welcher Reihenfolge ausgegeben?

for (let n = 2; n <= 7; n++) {
  if (n === 4) continue;
  if (n === 6) break;
  console.log(n);
}
  1. 2, 3
  2. 2, 3, 5, 6
  3. 2, 3, 5, 7
  4. 2, 3, 5
Antwort zeigenAntwort ausblenden
Antwort: D
Bei vier überspringt continue die Ausgabe, lässt aber die Aktualisierung des Zählers zu. Danach wird fünf ausgegeben; bei sechs beendet break die Schleife vor der Ausgabe. Die bei drei endende Folge verwechselt continue mit einem vorzeitigen Ausstieg, während eine spätere sieben voraussetzen würde, dass die Schleife den Abbruch übersteht.

Frage 6 von 10

Welches Wertepaar ergeben grid.length und grid[1][2]?

const grid = [[6, 2, 8], [9, 5, 1]];
  1. 3 und 1
  2. 2 und 1
  3. 2 und 5
  4. 6 und 8
Antwort zeigenAntwort ausblenden
Antwort: B
Das äußere Array enthält zwei Zeilenarrays, seine Länge ist also zwei. Index 1 wählt [9, 5, 1] und Index 2 innerhalb dieser Zeile wählt eins. Eine Länge von drei verwendet eine Zeilenlänge für das äußere Array und verwechselt die beiden Ebenen.

Frage 7 von 10

Wie viele Schleifendurchläufe werden ausgeführt, bevor diese Schleife endet?

let size = 3;
let rounds = 0;
while (size < 20) {
  size *= 2;
  rounds++;
}
  1. 3 Schleifendurchläufe
  2. 2 Schleifendurchläufe
  3. 4 Schleifendurchläufe
  4. 6 Schleifendurchläufe
Antwort zeigenAntwort ausblenden
Antwort: A
Die aufeinanderfolgenden Größen nach jedem Schleifendurchlauf sind 6, 12 und 24. Die ersten beiden erlauben noch einen weiteren Durchlauf, aber 24 < 20 ist falsch, sodass die endgültige Anzahl drei beträgt. Zwei Durchläufe würden bei zwölf stoppen, obwohl die Schleifenbedingung noch weitere Arbeit verlangt.

Frage 8 von 10

Wie oft wird count++ ausgeführt?

let count = 0;
for (let a = 0; a < 4; a++) {
  for (let b = a + 1; b < 4; b++) {
    if (b === 3) break;
    count++;
  }
}
  1. 2-mal
  2. 4-mal
  3. 3-mal
  4. 6-mal
Antwort zeigenAntwort ausblenden
Antwort: C
Für a = 0 wird die Erhöhung bei b = 1 und 2 ausgeführt; für a = 1 wird sie bei b = 2 ausgeführt. Bei b = 3 wird jede innere Schleife vor der Erhöhung abgebrochen und a = 3 hat keine inneren Schleifendurchläufe. Sechs zählt alle unterschiedlichen Paare, übersieht aber die vorzeitigen Abbrüche.

Frage 9 von 10

Diese Umwandlung soll dieselben Werte wie eine Zählschleife ausgeben, die 2 überspringt. Wie lässt sie sich unter Beibehaltung der while-Form korrigieren?

let i = 0;
while (i < 4) {
  if (i === 2) continue;
  console.log(i);
  i++;
}
  1. Verwende if (i === 2) { break; }.
  2. Verwende if (i === 2) { i++; continue; }.
  3. Verschiebe i++ direkt vor console.log(i).
  4. Ändere die Bedingung zu i <= 4.
Antwort zeigenAntwort ausblenden
Antwort: B
Bei zwei springt der aktuelle Code ohne Aktualisierung zur Bedingung zurück und bleibt hängen. Eine Erhöhung innerhalb dieses Ausführungszweigs vor dem Fortsetzen überspringt zwei und lässt drei ausgeben, entsprechend 0, 1, 3. Ersetzt du continue durch break, endet die Schleife bei zwei und der erforderliche spätere Wert fehlt.

Frage 10 von 10

Was gibt [9, 2, 9].lastIndexOf(9) zurück?
  1. 0
  2. 3
  3. 2
  4. 9
Antwort zeigenAntwort ausblenden
Antwort: C
Die letzte neun steht am nullbasierten Index zwei, daher gibt lastIndexOf zwei zurück. Null ist die Position der ersten neun und würde von indexOf zurückgegeben. Die Methode meldet eine Position, nicht den passenden Wert oder die Arraylänge.
Set 2: Bearbeite Arrays und erstelle Ergebnisse mit Schleifen10 Übungsfragen

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

Frage 1 von 10

Was enthält size nach diesen Anweisungen?

const tags = ["new", "open"];
const size = tags.push("done");
  1. ["new", "open", "done"]
  2. 3
  3. "done"
  4. 2
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Welche Werte haben cut und data danach?

const data = [4, 8, 12, 16];
const cut = data.splice(1, 2, 7);
  1. cut = [8]; data = [4, 7, 12, 16]
  2. cut = [4, 7, 16]; data = [8, 12]
  3. cut = [8, 12]; data = [4, 8, 12, 16]
  4. cut = [8, 12]; data = [4, 7, 16]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Suche muss einen Wert an Index null erkennen und einen fehlenden Wert ablehnen. Welche Bedingung sollte if (items.indexOf(target)) ersetzen?
  1. if (items.indexOf(target) !== -1)
  2. if (items.indexOf(target) > 0)
  3. if (items.indexOf(target) !== 0)
  4. if (items.indexOf(target) === 1)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welcher Schleifenkopf liefert jeden Zeichenkettenwert aus labels der Reihe nach?
  1. for (const label in labels)
  2. for (const label of labels.length)
  3. for (const label of labels)
  4. for (const label in labels.length)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was ist der endgültige Wert von count?

let count = 0;
for (const n of [11, 6, 14, 9]) {
  if (n >= 10) count++;
}
  1. 2
  2. 4
  3. 25
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was bleibt nach diesem Code in values?

const values = [3, 6, 8, 9];
for (let i = 0; i < values.length; i++) {
  if (values[i] % 3 === 0) values.splice(i, 1);
}
  1. [8]
  2. [6, 8, 9]
  3. [3, 8]
  4. [6, 8]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welcher Wert ergibt sich aus "7;12;5".split(";").join(" / ")?
  1. [7, 12, 5]
  2. "7 / 12 / 5"
  3. "7;12;5"
  4. "7 / 12 / 5 / "
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Welches Array wird erstellt?

const readings = [9, 4, 8, 3];
const rises = [];
for (let i = 1; i < readings.length; i++) {
  const change = readings[i] - readings[i - 1];
  if (change > 0) rises.push(change);
}
  1. [-5, 4, -5]
  2. [8]
  3. [4]
  4. [5, 5]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welche Länge und welches letzte Element hat a danach?

const a = [2, 4];
a[5] = 12;
  1. Länge 3; letztes Element 12.
  2. Länge 5; letztes Element 12.
  3. Länge 6; letztes Element undefined.
  4. Länge 6; letztes Element 12.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Maximum muss ein Element eines nicht leeren numerischen Arrays sein, auch wenn jeder Wert negativ ist. Warum kann ein Start bei 0 das falsche Ergebnis liefern?
  1. Null erzwingt bei positiven Daten für jeden Vergleich den Wert falsch.
  2. Null kann größer als jedes Element sein und nie ersetzt werden.
  3. Null lässt die Schleife nach ihrem ersten negativen Element stoppen.
  4. Null wird vor dem Vergleich zu jedem Element addiert.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Transformiere und durchsuche Arrays und reduziere sie10 Übungsfragen

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

Frage 1 von 10

Was gibt [4, 7].map(n => { n + 3; }) zurück?
  1. [7, 10]
  2. undefined
  3. [4, 7]
  4. [undefined, undefined]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Welches Array ergibt sich aus diesem Ausdruck?

[5, 16, 9, 22].filter(n => n > 10).map(n => n - 2)
  1. [3, 14, 7, 20]
  2. [14, 20]
  3. [16, 22]
  4. [14]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Was gibt [8, 0, 6].find(n => n < 2) zurück und wie sollte bei diesem numerischen Array auf Erfolg geprüft werden?
  1. undefined; prüfe result === undefined.
  2. 0; prüfe Boolean(result).
  3. 0; prüfe result !== undefined.
  4. 1; prüfe result !== -1.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welchen Wert gibt diese Reduktion zurück?

[6, 3, 5].reduce((total, n) => total + n, 4)
  1. 18
  2. 14
  3. 10
  4. 24
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welche Werte werden ausgegeben und was wird result zugewiesen?

const result = [2, 5, 8].forEach(n => {
  if (n === 5) return;
  console.log(n);
});
  1. Gibt 2 aus; result ist undefined.
  2. Gibt 2, 8 aus; result ist [2, 8].
  3. Gibt 2, 8 aus; result ist undefined.
  4. Gibt 2, 5, 8 aus; result ist undefined.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Gültige Messwerte schließen null ein; nur null bedeutet fehlend. Welcher Ausdruck wandelt alle gültigen Messwerte in Meter um?

const km = [0, null, 1.2, 0.4];
  1. km.filter(n => n).map(n => n * 1000)
  2. km.map(n => n * 1000).filter(n => n !== null)
  3. km.filter(n => n !== null).map(n => n * 100)
  4. km.filter(n => n !== null).map(n => n * 1000)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Was gibt der Code zurück?

[64, 40, 91].reduce((count, score) => {
  if (score >= 60) return count + 1;
}, 0)
  1. NaN
  2. 2
  3. 1
  4. undefined
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Auswertung soll nur dann wahr sein, wenn mindestens eine Punktzahl vorliegt und jede Punktzahl mindestens 70 beträgt. Welcher Ausdruck behandelt alle Eingabegrößen?
  1. scores.every(s => s >= 70)
  2. scores.length > 0 && scores.every(s => s >= 70)
  3. scores.length > 0 && scores.some(s => s >= 70)
  4. scores.length > 0 || scores.every(s => s >= 70)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Was erzeugt dieser Ausdruck?

["6", "15", "4"].map(Number)
  .filter(n => n % 2 === 0)
  .map((n, i) => n + i)
  1. [6, 5]
  2. [6, 6]
  3. [6, 4]
  4. ["60", "42"]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Für eine nicht leere numerische Liste wird der größte Wert benötigt, auch wenn alle Werte negativ sind. Welche Reduktion erfüllt diese Anforderung?
  1. nums.reduce((best, n) => n > best ? n : best, 0)
  2. nums.reduce((best, n) => n < best ? n : best, Infinity)
  3. nums.reduce((best, n) => n > best ? n : best, -Infinity)
  4. nums.reduce((best, n) => n > best, -Infinity)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Sortiere, kopiere und kombiniere Ergebnisse sicher10 Übungsfragen

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

Frage 1 von 10

Was gibt [8, 30, 4].toSorted() zurück?
  1. [4, 8, 30]
  2. [30, 4, 8]
  3. [8, 4, 30]
  4. [8, 30, 4]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Welche Arrays enthalten a und c danach?

const a = [6, 2];
const b = a;
const c = [...a];
b.push(9);
c[0] = 1;
  1. a = [1, 2, 9]; c = [1, 2, 9]
  2. a = [6, 2]; c = [1, 2]
  3. a = [6, 2, 9]; c = [1, 2, 9]
  4. a = [6, 2, 9]; c = [1, 2]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Wie lässt sich readings vom größten zum kleinsten Wert ordnen und dabei die ursprüngliche Folge erhalten?
  1. readings.toSorted((a, b) => b - a)
  2. readings.sort((a, b) => b - a)
  3. readings.toReversed()
  4. readings.toSorted((a, b) => a - b)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welcher Ausdruck ordnet "part12", "part3" und "part1" in natürlicher numerischer Namensreihenfolge, ohne parts zu verändern?
  1. parts.toSorted((a, b) => a.localeCompare(b, "en"))
  2. parts.toSorted((a, b) => a - b)
  3. parts.toSorted((a, b) => a.localeCompare(b, "en", { numeric: true }))
  4. parts.toSorted((a, b) => b.localeCompare(a, "en", { numeric: true }))
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welche Werte haben rows[0] und copy[1] danach?

const rows = [[5], [8]];
const copy = [...rows];
copy[0].push(6);
copy[1] = [2];
  1. rows[0] = [5]; copy[1] = [2]
  2. rows[0] = [5, 6]; copy[1] = [8, 2]
  3. rows[0] = [5, 6]; copy[1] = [2]
  4. rows[0] = [5]; copy[1] = [8, 2]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Programm formatiert [1200, 25, 4] mit numbers.map(n => n.toLocaleString("de-DE")).toSorted(). Wie sollte es die Werte ordnen und formatieren, um numbers zu erhalten und die Werte numerisch aufsteigend anzuzeigen?
  1. Numerisches toSorted, dann formatieren: ["4", "25", "1.200"].
  2. Formatieren, dann Standard-toSorted: ["1.200", "25", "4"].
  3. Standard-toSorted, dann formatieren: ["1.200", "25", "4"].
  4. Numerisches sort, dann formatieren: ["4", "25", "1.200"].
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welches Array wird zurückgegeben?

["lion", "ox", "bear", "ant"]
  .toSorted((a, b) => a.length - b.length)
  .toReversed()
  1. ["lion", "bear", "ant", "ox"]
  2. ["bear", "lion", "ox", "ant"]
  3. ["ox", "ant", "lion", "bear"]
  4. ["bear", "lion", "ant", "ox"]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was enthält view danach?

const values = [7, 2, 5];
const i = values.findIndex(n => n < 0);
values.splice(i, 1);
const view = values.toReversed();
  1. [5, 2, 7]
  2. [2, 7]
  3. [7, 2]
  4. [5, 2]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welche Länge hat joined?

const left = [4, 6];
const right = [8, 10, 12];
const joined = [...left, right];
  1. 5
  2. 2
  3. 4
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Diese Datumszeichenketten werden zeitlich falsch sortiert: ["08/02/2027", "19/01/2026", "03/12/2026"] im Format Tag/Monat/Jahr. Welche gespeicherten Zeichenketten ergeben für dieselben Daten eine chronologische Textreihenfolge?
  1. ["2026-01-19", "2026-12-03", "2027-02-08"]
  2. ["2026-03-12", "2026-19-01", "2027-08-02"]
  3. ["03/12/2026", "08/02/2027", "19/01/2026"]
  4. ["2027-02-08", "2026-12-03", "2026-01-19"]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

71 Schlüsselbegriffe, jeweils mit Definition

A

Ablauftabelle
Eine Ablauftabelle hält veränderliche Werte bei aufeinanderfolgenden Ausführungsschritten fest, sodass das Verhalten einer Schleife verfolgt und geprüft werden kann.
Spalten für den aktuellen Messwert und die laufende Summe zeigen genau, welcher Schleifendurchlauf zuerst eine falsche Summe erzeugt.
Akkumulator
Ein Akkumulator ist eine Variable oder ein Callback-Wert, der ein wachsendes Ergebnis von einem verarbeiteten Element zum nächsten weiterträgt.
Eine Temperatursumme behält die vorherige Summe, bevor sie bei jedem Schritt den aktuellen Messwert addiert.
Aktualisierung
Eine Aktualisierung ändert den Zustand der Schleife zwischen Schleifendurchläufen; eine for-Schleife führt die Aktualisierung ihres Kopfes nach ihrem Rumpf aus.
Die Aktualisierung i += 5 macht den nächsten Zählerwert um fünf größer als den vorherigen.
Anfangswert
Ein Anfangswert gibt reduce seinen anfänglichen Akkumulator vor und wird unverändert zurückgegeben, wenn die Eingabe keine zu verarbeitenden Elemente enthält.
Die Angabe von 0 bewirkt, dass eine leere Summenreduktion null zurückgibt, statt einen TypeError auszulösen.
Array
Ein Array ist eine geordnete Sammlung von Werten mit indizierten Positionen, die über eine einzelne Referenz gespeichert und abgerufen wird.
Das Array [18, 21, 19, 24] enthält vier tägliche Temperaturmesswerte unter einem Variablennamen.
Arrayelement
Ein Arrayelement ist ein Wert, der an einer Position in einem Array gespeichert ist; es kann unter anderem eine Zahl, eine Zeichenkette oder ein weiteres Array sein.
In ["red", "green", "blue"] ist die Zeichenkette „green“ das an Index 1 gespeicherte Element.
Arrayidentität
Die Arrayidentität unterscheidet ein Array von einem anderen, selbst wenn beide Arrays derzeit dieselben Werte in derselben Reihenfolge enthalten.
[1, 2] === [1, 2] ist falsch, weil die Literale zwei getrennte Arrays erstellen.
Arraylänge
Die Arraylänge ist die Anzahl der indizierten Stellen bis zum Ende des Arrays, einschließlich der Lücken zwischen zugewiesenen Elementen.
Eine Zuweisung an Index 4 in einem kürzeren Array macht dessen Länge mindestens fünf, selbst wenn frühere Stellen leer sind.
Aufsteigende Reihenfolge
Die aufsteigende Reihenfolge ordnet Werte nach dem gewählten Vergleich von klein nach groß, etwa mit einer numerischen Vergleichsfunktion, die subtrahiert.
Das numerische Sortieren von [10, 9, 1] in aufsteigender Reihenfolge ergibt [1, 9, 10].

B

break-Anweisung
Eine break-Anweisung verlässt sofort die sie umschließende Schleife oder eine angegebene Schleife mit Schleifenmarke und setzt danach die Ausführung fort.
Eine Suche nach dem ersten Treffer verwendet break, damit spätere Werte nach dem Speichern eines Treffers nicht geprüft werden.

C

Callback
Ein Callback ist eine Funktion, die an eine andere Funktion übergeben wird. Diese ruft den Callback als Teil ihrer Arbeit auf, häufig mit jedem Arrayelement.
Map ruft seinen Callback mit einem Element auf und verwendet den zurückgegebenen Wert im neuen Array.
Collator
Ein Collator bündelt Vergleichsregeln eines Gebietsschemas in einer wiederverwendbaren Intl.Collator-Instanz mit einer fertigen Vergleichsfunktion.
Ein Collator mit numeric: true sortiert Namen mit Ziffern in natürlicher numerischer Reihenfolge.
continue-Anweisung
Eine continue-Anweisung überspringt den restlichen Code des Rumpfs für den aktuellen Schleifendurchlauf und setzt die Ausführung mit dem nächsten Schritt der Schleife fort.
Eine Prüfung auf gerade Zahlen kann continue verwenden, um die Ausgabe zu überspringen, während der Zähler einer for-Schleife trotzdem aktualisiert wird.

D

do...while-Schleife
Eine do...while-Schleife führt ihren Rumpf aus, bevor sie die Bedingung prüft, sodass ihr erster Schleifendurchlauf auch dann stattfindet, wenn die Prüfung danach fehlschlägt.
Eine do...while-Schleife zum Zählen von Ziffern verarbeitet null einmal und zählt sie als einstellige Zahl.

E

Endlosschleife
Eine Endlosschleife wiederholt sich, ohne zu enden, weil ihre Ausführung nie einen wirksamen Ausstieg erreicht.
Ein Zähler, der sich nie ändert, kann dazu führen, dass while (n < 3) denselben Wert endlos ausgibt.
entries
Entries ist eine Arraymethode, die Index-Wert-Paare zum Durchlaufen liefert, sodass beide Informationen zusammen gelesen werden können.
for (const [i, name] of names.entries()) kann mit i + 1 nummerierte Bezeichnungen ausgeben.
every
Every ist eine Arraymethode, die wahr zurückgibt, wenn kein geprüftes Element durchfällt; sie stoppt bei einem Fehlschlag und ist für ein leeres Array wahr.
Kombiniere eine Prüfung auf positive Länge mit every, wenn ein Ergebnis „alle bestanden“ mindestens eine Punktzahl enthalten muss.

F

filter
Filter ist eine Arraymethode, die ursprüngliche Elemente zurückgibt, deren Callback-Prüfung truthy ist, und dabei ihre ursprüngliche Reihenfolge erhält.
Eine Prüfung t => t > 20 wählt warme Messwerte aus, ohne sie durch boolesche Werte zu ersetzen.
find
Find ist eine Arraymethode, die das erste Element zurückgibt, das eine Callback-Prüfung besteht, oder undefined, wenn kein Treffer gefunden wird.
Die Suche nach einer Zahl unter eins in [3, 0, 5] gibt null zurück, einen erfolgreichen, aber falsy Treffer.
findIndex
FindIndex ist eine Arraymethode, die die erste Position zurückgibt, deren Element eine Callback-Prüfung besteht, oder minus eins, wenn keines sie besteht.
Eine gefundene Position kann zum Entfernen verwendet werden, nachdem geprüft wurde, dass sie nicht der Wert -1 für einen fehlenden Treffer ist.
Flache Kopie
Eine flache Kopie erstellt ein neues äußeres Array und behält dieselben Elementwerte, einschließlich Referenzen auf verschachtelte Arrays.
Das Hinzufügen zu einer Zeile eines mit Spread kopierten Rasters verändert die mit dem ursprünglichen Raster gemeinsam genutzte Zeile.
Flag
Ein Flag ist ein boolescher Wert, der festhält, ob eine Bedingung erfüllt wurde, etwa ob ein Treffer oder ein Fehlschlag aufgetreten ist.
Ein Flag für „alle bestanden“ beginnt mit wahr und wird falsch, wenn eine nicht ausreichende Punktzahl erscheint.
for...in-Schleife
Eine for...in-Schleife besucht aufzählbare Eigenschaftsnamen und ist daher als gewöhnliche Schleife über Arraywerte ungeeignet.
Bei einem Array liefert sie Indexnamen als Zeichenketten und kann auch hinzugefügte Eigenschaften besuchen, die keine Elemente sind.
for...of-Schleife
Eine for...of-Schleife erhält jeden von einem iterierbaren Objekt gelieferten Wert der Reihe nach, ohne einen ausdrücklichen numerischen Zähler zu benötigen.
for (const fruit of fruits) liest Fruchtnamen direkt, sodass der Rumpf jeden Namen verarbeiten kann.

G

Gebietsschema
Ein Gebietsschema bezeichnet sprachliche oder regionale Konventionen für Operationen wie Textvergleich und Zahlenformatierung.
Das Gebietsschema „sv“ setzt „ä“ nach „z“, während der deutsche Vergleich es vor „z“ setzt.
Gleitkommarundung
Gleitkommarundung entsteht, wenn eine Zahl nicht exakt binär gespeichert werden kann, und wirkt sich auf Rechnungen und Gleichheitsprüfungen aus.
Zehnmal 0.1 zu addieren ergibt 0.9999999999999999, sodass ein exakter Endpunkt einer Schleife verfehlt werden kann.

I

In-place-Sortierung
Eine In-place-Sortierung ändert die Reihenfolge im bestehenden Array und gibt dasselbe Array zurück, statt ein unabhängiges zu erstellen.
Nach const ordered = scores.sort(...) verweisen ordered und scores auf dasselbe Array.
Index
Ein Index bezeichnet eine Position in einem Array. Gewöhnliche indizierte Elemente werden von null bis eins weniger als die Länge gezählt.
Das dritte Element wird mit colors[2] gelesen, weil die nullbasierte Indizierung vor Index eins beginnt.
Indexbasierte Traversierung
Eine indexbasierte Traversierung besucht ein Array über numerische Positionen und erlaubt die Steuerung von Richtung, Schrittweite und Zugriff auf Nachbarn.
Ein rückwärtiger Durchlauf beginnt bei arr.length - 1 und verringert den Index, solange er mindestens null ist.
Indexsuche
Eine Indexsuche gibt eine passende Position oder eine Markierung für einen fehlenden Treffer zurück; indexOf und lastIndexOf verwenden minus eins für einen Fehlschlag.
[3, 7, 3].lastIndexOf(3) gibt 2 zurück und verweist damit auf das letzte passende Element.
Initialisierung
Die Initialisierung richtet den Anfangszustand einer Schleife ein; bei einer for-Schleife wird sie einmal vor der ersten Bedingungsprüfung ausgeführt.
In for (let i = 1; i <= 5; i++) erstellt die Initialisierung i mit dem Anfangswert 1.
ISO-Datumszeichenkette
Eine ISO-Datumszeichenkette im Format YYYY-MM-DD mit festen Stellenzahlen ordnet Jahr, Monat und Tag so an, dass sie als Text chronologisch sortiert wird.
Die Zeichenkette „2025-11-02“ wird vor „2026-01-20“ sortiert, weil zuerst das Jahr verglichen wird.
Iterierbares Objekt
Ein iterierbares Objekt liefert eine Folge von Werten, die Operationen wie for...of und Spread der Reihe nach besuchen können.
Arrays und Zeichenketten sind iterierbar, aber das Ausbreiten der Zahl 5 in ein Array löst einen TypeError aus.

J

join
Join ist eine Arraymethode, die eine Zeichenkette erzeugt, indem sie ein gewähltes Trennzeichen zwischen die Textformen ihrer Elemente setzt.
["2026", "03", "15"].join("-") erzeugt die Datumszeichenkette „2026-03-15“.

L

Leere Stelle
Eine leere Stelle ist eine indizierte Lücke ohne gespeichertes Element; sie zählt zur Arraylänge und ergibt beim Lesen undefined.
new Array(3) erstellt drei leere Stellen, während [3] ein ausdrücklich gespeichertes Element erstellt.
Listenformatierung
Die Listenformatierung wandelt Zeichenkettenelemente in lesbaren Text mit Trennzeichen und Verbindungswörtern um, die zum Gebietsschema der Leser passen.
Intl.ListFormat kann in einer amerikanisch-englischen Liste „and“ vor dem letzten Namen hinzufügen.
localeCompare
LocaleCompare ist eine Zeichenkettenmethode, die die relative Textreihenfolge nach den Regeln eines Gebietsschemas durch das Vorzeichen ihres numerischen Ergebnisses meldet.
Ein negatives Ergebnis von a.localeCompare(b, "en") setzt bei diesem Vergleich a vor b.

M

map
Map ist eine Arraymethode, die Callback-Ergebnisse in einem neuen Array derselben Länge wie das ursprüngliche Array speichert.
Das Umwandeln von Entfernungen mit km => km * 1000 erstellt entsprechende Messwerte in Metern.
Methodenkette
Eine Methodenkette verwendet den Rückgabewert eines Aufrufs als Empfänger des nächsten Aufrufs, sodass sich eine Datenverarbeitung von links nach rechts lesen lässt.
Eine Kette aus filter und map behält zuerst ausgewählte Zahlen und transformiert dann nur diese behaltenen Zahlen.
Mutation
Eine Mutation verändert den Inhalt oder die Reihenfolge eines bestehenden Arrays, sodass die Änderung über jede Referenz auf dieses Array sichtbar ist.
Der Aufruf scores.push(95) verändert scores, selbst wenn die Variable mit const deklariert wurde.

O

Off-by-one-Fehler
Ein Off-by-one-Fehler führt dazu, dass eine Berechnung an einer Grenze oder eine Schleife eine Position zu viel einschließt oder eine vorgesehene Position auslässt.
Die Verwendung von i <= arr.length liest beim Durchlaufen eines Arrays einen Index hinter dem letzten Element.

P

Parameter
Ein Parameter ist eine benannte Eingabe in der Definition einer Funktion; seine Position bestimmt, welches übergebene Argument er erhält.
In einem map-Callback (value, i) erhält der zweite Parameter den Index des aktuellen Elements.
Pfeilfunktion
Eine Pfeilfunktion definiert eine Funktion mit Pfeilsyntax, häufig kompakt als Parameter, gefolgt von einem zurückgegebenen Ausdruck.
Der Callback n => n * 2 nimmt eine Zahl entgegen und gibt einen doppelt so großen Wert zurück.
Prädikat
Ein Prädikat ist eine Funktion, die als Prüfung verwendet wird; ihr Ergebnis entscheidet, ob ein Element eine Bedingung erfüllt oder behalten werden soll.
Das Prädikat n => n !== null erhält gültige Messwerte von null und lehnt null als fehlenden Messwert ab.
push und pop
Push und pop fügen am Ende eines Arrays hinzu beziehungsweise entfernen dort; push gibt die neue Länge zurück, während pop das entfernte Element zurückgibt.
Eine Liste kann mit push einen Namen anhängen und später mit pop diesen letzten Namen entfernen.

R

reduce
Reduce ist eine Arraymethode, die einen Akkumulator durch Callback-Aufrufe weiterträgt und das endgültige angesammelte Ergebnis zurückgibt.
Eine Summenreduktion mit Anfangswert null addiert jede Temperatur und gibt eine numerische Summe zurück.
Reduktionsschritt
Ein Reduktionsschritt verwendet den aktuellen Akkumulator und ein Element, um den Akkumulator zurückzugeben, den der nächste Callback-Aufruf erhält.
Ein Zählschritt gibt je nach Prüfung entweder count + 1 oder die unveränderte Anzahl zurück.
Referenz
Eine Referenz verweist auf ein gemeinsam genutztes Array, sodass mehrere Variablen auf denselben Inhalt zugreifen können, ohne jeweils eine eigene Kopie zu enthalten.
Nach const b = a verändert der Aufruf b.push(4) auch das über a gelesene Array.
Restparameter
Ein Restparameter sammelt die übrigen übergebenen Argumente einer Funktion in einem Array; Spread in einem Aufruf breitet Werte in der entgegengesetzten Richtung aus.
In function total(...nums) sammelt nums die separaten Argumente in einem Array.
Rückgabewert
Ein Rückgabewert ist das Ergebnis, das eine Funktion an ihren Aufrufer zurückgibt; ein Blockrumpf ohne return-Anweisung ergibt undefined.
Ein map-Callback mit { n * 2; } berechnet ein Produkt, gibt es aber nicht zur Speicherung zurück.

S

Schleifenbedingung
Eine Schleifenbedingung ist die Prüfung, die entscheidet, ob ein weiterer Schleifendurchlauf stattfinden darf; eine falsche vorherige Prüfung verhindert die Ausführung des Rumpfs.
Bei i < 10 beendet das Erreichen von i = 10 die Schleife vor einer weiteren Ausführung des Rumpfs.
Schleifendurchlauf
Ein Schleifendurchlauf ist eine Ausführung eines Schleifenrumpfs, die bei einer Zählschleife nach einer erfolgreichen Bedingungsprüfung stattfindet.
Die Ausgabe der Zahlen 1 bis 5 mit einer Ausgabe pro Rumpfausführung benötigt fünf Schleifendurchläufe.
Schleifenmarke
Eine Schleifenmarke benennt eine Schleife, sodass ein break oder continue mit Schleifenmarke den Ablauf auf diese umschließende Schleife richten kann.
Die Anweisung break outer; kann bei einem Treffer beide Schleifen beenden, wenn die äußere Schleife die Marke outer trägt.
Seiteneffekt
Ein Seiteneffekt ist eine Aktion, die eine Funktion zusätzlich zur Bereitstellung ihres Rückgabewerts ausführt, etwa eine Ausgabe oder das Ändern gemeinsam genutzter Daten.
Ein forEach-Callback kann einen Namen ausgeben, obwohl die Methode selbst undefined zurückgibt.
shift und unshift
Shift und unshift entfernen Elemente am Anfang eines Arrays beziehungsweise fügen dort welche hinzu und ändern dabei die Indizes der verbleibenden Elemente.
Die Verwendung von queue.shift() entfernt den ersten wartenden Namen und verschiebt den nächsten Namen auf Index null.
slice
Slice ist eine Arraymethode, die eine flache Kopie eines Bereichs ohne den Endindex zurückgibt, ohne das Original zu bearbeiten.
values.slice(1, 3) kopiert die Werte an den Indizes eins und zwei in ein neues Array.
some
Some ist eine Arraymethode, die wahr zurückgibt, wenn mindestens eine Callback-Prüfung bestanden wird, und stoppt, sobald dieser Erfolg gefunden ist.
Die Prüfung, ob eine Punktzahl unter fünfzig liegt, gibt bei der ersten nicht ausreichenden Punktzahl wahr zurück.
splice
Splice ist eine Arraymethode, die Elemente direkt entfernt oder einfügt und ein Array der entfernten Elemente zurückgibt.
Der Aufruf days.splice(2, 0, "Wed") fügt an Index zwei einen Tag ein, ohne einen vorhandenen Tag zu entfernen.
split
Split ist eine Zeichenkettenmethode, die ein Array aus Textteilen erstellt, indem sie an Vorkommen eines angegebenen Trennzeichens trennt.
Das Zerlegen von „4,8,15“ am Komma ergibt drei Zeichenketten, die für eine numerische Addition noch umgewandelt werden müssen.
Spread-Syntax
Die Spread-Syntax breitet die Werte eines iterierbaren Objekts in einem Arrayliteral oder als separate Argumente bei einem Funktionsaufruf aus.
Der Ausdruck [...first, ...second] setzt die Werte beider Arrays in ein neues äußeres Array.
Stabile Sortierung
Eine stabile Sortierung erhält die ursprüngliche relative Reihenfolge von Elementen, die die Vergleichsfunktion als gleich behandelt.
Wörter gleicher Länge behalten ihre frühere Reihenfolge, wenn nur nach ihrer Länge sortiert wird.

T

Tiefe Kopie
Eine tiefe Kopie dupliziert verschachtelte Daten ebenso wie ihren äußeren Container, sodass Änderungen an kopierten Zeilen die ursprünglichen Zeilen nicht beeinflussen.
Für ein Raster aus Zahlenarrays erstellt structuredClone unabhängige Kopien der inneren Zeilen.

U

Umkehrung
Eine Umkehrung dreht die aktuelle Folge vom letzten zum ersten Element um, ohne Werte zu vergleichen, um eine numerische oder alphabetische Reihenfolge herzustellen.
Das Umkehren von [3, 1, 2] ergibt [2, 1, 3], was keine numerisch sortierte Folge ist.

V

Vergleichsfunktion
Eine Vergleichsfunktion gibt eine negative Zahl, null oder eine positive Zahl zurück, um die relative Reihenfolge zweier Werte beim Sortieren zu bestimmen.
Die Vergleichsfunktion (a, b) => a - b setzt kleinere numerische Werte vor größere.
Verschachtelte Schleife
Eine verschachtelte Schleife ist eine Schleife innerhalb einer anderen Schleife; ihre innere Abfolge läuft für jeden Schleifendurchlauf, der sie erreicht, erneut ab.
Ein Durchlauf durch drei Zeilen und vier Spalten führt den inneren Rumpf zwölfmal aus, wenn alle Positionen besucht werden.
Verschachteltes Array
Ein verschachteltes Array ist ein Array, das als Element in einem anderen Array gespeichert ist. So sind Strukturen wie Zeilen von Werten möglich.
In grid[1][0] wählt der erste Index eine Zeile und der zweite einen Wert innerhalb dieser Zeile.
Vorzeitiger Abbruch
Ein vorzeitiger Abbruch beendet ein Durchlaufen, sobald dessen Ergebnis feststeht, und vermeidet spätere Prüfungen, die die Antwort nicht ändern können.
Eine find-Suche stoppt bei ihrem ersten Treffer, während every bei der ersten nicht bestandenen Prüfung stoppt.

W

while-Schleife
Eine while-Schleife prüft ihre Bedingung vor jedem Schleifendurchlauf und wiederholt sich, solange die Bedingung truthy ist; sie kann dabei auch keinmal durchlaufen werden.
Eine Wachstumsberechnung verwendet while (balance < 1500), um sich bis zum Erreichen des Zielwerts zu wiederholen.

Z

Zahlenformatierung
Die Zahlenformatierung wandelt eine Zahl anhand von Konventionen wie Dezimal- und Gruppierungstrennzeichen des Gebietsschemas in Anzeigetext um.
Das Formatieren von 1234.5 mit „de-DE“ erzeugt „1.234,5“, eine Zeichenkette zur Anzeige nach der numerischen Sortierung.
Zähler
Ein Zähler erfasst, wie viele Ereignisse oder Treffer aufgetreten sind. Er beginnt meist bei null und erhöht sich pro Treffer um eins.
Ein Zähler für warme Tage erhöht sich nur, wenn die aktuelle Temperatur die gewählte Prüfung besteht.
Zugehörigkeitsprüfung
Eine Zugehörigkeitsprüfung fragt, ob ein Wert in einer Sammlung vorkommt, und meldet einen booleschen Wert statt einer passenden Position.
drinks.includes("tea") beantwortet, ob genau diese kleingeschriebene Zeichenkette im Array vorhanden ist.

Ü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