From e5416ba1ae9229e80f590062175ec1d854b77e3b Mon Sep 17 00:00:00 2001
From: mmunin <221841703+mmunin@users.noreply.github.com>
Date: Tue, 5 Aug 2025 15:31:01 +0200
Subject: [PATCH] Add [DE] Translation of root-level .md files
---
de/Copyright.md | 35 +++++
de/Credits.md | 27 ++++
de/Dedication.md | 11 ++
de/Preface.md | 20 +++
de/References.md | 40 ++++++
de/SUMMARY.md | 171 ++++++++++++++++++++++++
de/date-and-time.md | 86 +++++++++++++
de/events.md | 79 ++++++++++++
de/json.md | 50 ++++++++
de/modules.md | 78 +++++++++++
de/regular-expression.md | 271 +++++++++++++++++++++++++++++++++++++++
de/resources.md | 72 +++++++++++
12 files changed, 940 insertions(+)
create mode 100644 de/Copyright.md
create mode 100644 de/Credits.md
create mode 100644 de/Dedication.md
create mode 100644 de/Preface.md
create mode 100644 de/References.md
create mode 100644 de/SUMMARY.md
create mode 100644 de/date-and-time.md
create mode 100644 de/events.md
create mode 100644 de/json.md
create mode 100644 de/modules.md
create mode 100644 de/regular-expression.md
create mode 100644 de/resources.md
diff --git a/de/Copyright.md b/de/Copyright.md
new file mode 100644
index 00000000..00b5cd78
--- /dev/null
+++ b/de/Copyright.md
@@ -0,0 +1,35 @@
+---
+Seite: II
+Kapitel:
+---
+
+# Copyright
+
+
+
+
+
+
+
+
+
+
+**Learn JavaScript: Beginners Edition**
+First Edition
+
+Copyright © 2023 by Suman Kunwar
+
+
+
+
+Dieses Werk steht unter der Apache 2.0 Lizenz ([Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)).
+Basierend auf einem Werk auf [javascript.sumankunwar.com.np](https://javascript.sumankunwar.com.np/).
+
+ASIN: B0C53J11V7
+
+ISBN: 9789937171892
+
+
+
+
+
diff --git a/de/Credits.md b/de/Credits.md
new file mode 100644
index 00000000..ff80bf07
--- /dev/null
+++ b/de/Credits.md
@@ -0,0 +1,27 @@
+---
+Seite: VI
+Kapitel:
+---
+
+### Projektverantwortlicher
+---
+
+
|
+
+ + Suman Kunwar + + |
+
Click me to activate the handler.
+ +``` + +Hier wird `addEventListener` am `window`-Objekt (ein vom Browser bereitgestelltes eingebautes Objekt) aufgerufen, um einen Handler für das gesamte `window` zu registrieren. Der Aufruf der Methode `addEventListener` registriert das zweite Argument als Funktion, die aufgerufen wird, sobald das durch das erste Argument beschriebene Ereignis eintritt. + +{% hint style="info" %} +Ereignis-Listener werden nur aufgerufen, wenn das Ereignis im Kontext des Objekts passiert, auf dem sie registriert wurden. +{% endhint %} + +Einige der häufigen HTML-Ereignisse sind hier aufgeführt: + +| Ereignis | Beschreibung | +| ------------- |---------------------------------------------------------| +| `onclick` | Wenn der Benutzer auf das Element klickt | +| `onchange` | Wenn der Benutzer den Wert einer Formulareingabe ändert | +| `onkeydown` | Wenn der Benutzer eine Taste drückt | +| `onload` | Wenn der Browser das Laden abgeschlossen hat | +| `onmouseout` | Wenn der Mauszeiger das Element verlässt | +| `onmouseover` | Wenn der Mauszeiger über das Element bewegt wird | + + +Es ist üblich, dass Handler, die auf Knoten mit Kindelementen registriert sind, auch Ereignisse von diesen Kindknoten empfangen. Wenn beispielsweise ein Button innerhalb eines Absatzes geklickt wird, empfängt auch der Handler des Absatzes das Klick-Ereignis. Wenn in beiden ein Handler vorhanden ist, wird der innere zuerst ausgeführt. Man sagt, das Ereignis *propagiert* nach außen – vom auslösenden Knoten über dessen Eltern bis hin zur Wurzel des Dokuments. + +Der Ereignis-Handler kann die Methode `stopPropagation` am Ereignisobjekt aufrufen, um zu verhindern, dass weiter oben liegende Handler das Ereignis ebenfalls erhalten. Das ist nützlich, wenn du zum Beispiel einen Button in einem klickbaren Element hast und vermeiden möchtest, dass ein Klick auf den Button das äußere Element ebenfalls auslöst. + +```javascript +A paragraph with a .
+ +``` + +Hier sind sowohl am Absatz als auch am Button *`mousedown`*-Handler registriert. Beim Klick auf den Button ruft der Handler des Buttons `stopPropagation` auf, wodurch verhindert wird, dass der Handler des Absatzes ausgeführt wird. + +Ereignisse können ein Standardverhalten haben. Zum Beispiel: Ein Link navigiert beim Anklicken zur Zieladresse, beim Drücken der Abwärtstaste wird zum unteren Seitenbereich navigiert usw. Dieses Standardverhalten kann durch Aufruf der Methode `preventDefault` am Ereignisobjekt verhindert werden. + +```javascript +MDN + +``` + +Hier wird das Standardverhalten des Links beim Klick verhindert – also das Navigieren zur Zieladresse des Links. + diff --git a/de/json.md b/de/json.md new file mode 100644 index 00000000..8761a6e2 --- /dev/null +++ b/de/json.md @@ -0,0 +1,50 @@ +--- +layout: editorial +Kapitel: 11 +Seite: 82 +Beschreibung: JSON (JavaScript Object Notation) ist ein leichtgewichtiges Datenformat zum Austausch von Daten zwischen verschiedenen Systemen und Plattformen. Es wird häufig zur Datenübertragung und -speicherung verwendet, insbesondere in der Webentwicklung. +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +# Kapitel 11 +# JSON + +**J**ava**S**cript **O**bject **N**otation (JSON) ist ein textbasiertes Format zum Speichern und Übertragen von Daten. JavaScript-Objekte lassen sich leicht in JSON umwandeln und wieder zurück. Zum Beispiel: + +```javascript +// ein JavaScript-Objekt +let myObj = { name:"Ryan", age:30, city:"Austin" }; + +// in JSON konvertiert: +let myJSON = JSON.stringify(myObj); +console.log(myJSON); +// Ergebnis: '{"name":"Ryan","age":30,"city":"Austin"}' + +// zurückkonvertiert in ein JavaScript-Objekt +let originalJSON = JSON.parse(myJSON); +console.log(originalJSON); + +// Ergebnis: {name: 'Ryan', age: 30, city: 'Austin'} +``` + + + +`stringify` und `parse` sind die beiden Methoden, die von JSON unterstützt werden. + +| Methode | Beschreibung | +| ------------- | --------------------------------------------------------------- | +| `parse()` | Gibt ein JavaScript-Objekt aus dem geparsten JSON-String zurück | +| `stringify()` | Gibt einen JSON-String aus einem JavaScript-Objekt zurück | + + + +Die folgenden Datentypen werden von JSON unterstützt: + +* [string](./strings/README.md) +* [number](./numbers/README.md) +* [array](./arrays/README.md) +* [boolean](./basics/types.md#Boolean) +* [object](./basics/types.md#Object) mit gültigen JSON-Werten +* [null](./basics/types.md#NULL) + +JSON kann **keine** `function`, `date` oder `undefined` enthalten. + diff --git a/de/modules.md b/de/modules.md new file mode 100644 index 00000000..0259af5f --- /dev/null +++ b/de/modules.md @@ -0,0 +1,78 @@ +--- +layout: editorial +Kapitel: 13 +Seite: 87 +Beschreibung: Module sind eine Möglichkeit, Code in separate, wiederverwendbare und gekapselte Komponenten zu organisieren. Sie ermöglichen es Entwicklern, große und komplexe Codebasen in kleinere, handhabbare Teile zu zerlegen, was das Verständnis, die Wartung und die Zusammenarbeit erleichtert. +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +# Kapitel 13 +# Module + +In der realen Welt wächst ein Programm organisch mit den Anforderungen neuer Funktionalitäten. Mit wachsendem Codeumfang erfordert die Strukturierung und Wartung des Codes zusätzlichen Aufwand. Auch wenn sich dieser Aufwand langfristig auszahlt, ist es verlockend, ihn zu vernachlässigen und zuzulassen, dass Programme stark miteinander verflochten werden. In Wirklichkeit erhöht das jedoch die Komplexität der Anwendung, da man gezwungen ist, ein ganzheitliches Verständnis des Systems zu entwickeln und Schwierigkeiten hat, einzelne Teile isoliert zu betrachten. Außerdem muss man mehr Zeit investieren, um Funktionen aus einem stark verflochtenen Code herauszulösen. + +*Module* helfen dabei, diese Probleme zu vermeiden. Ein `Modul` gibt an, von welchen Codeteilen es abhängt, und welche Funktionalität es anderen Modulen zur Verfügung stellt. Module, die von anderen Modulen abhängen, nennt man *Abhängigkeiten*. Es gibt verschiedene Bibliotheken zur Modulverwaltung, die Code in Module organisieren und bei Bedarf laden können: + +* **AMD** – eines der ältesten Modulsysteme, ursprünglich verwendet von [require.js](https://requirejs.org/) +* **CommonJS** – Modulsystem, das für den Node.js-Server entwickelt wurde +* **UMD** – Modulsystem, das mit [AMD](https://requirejs.org/docs/whyamd.html#amd) und [CommonJS](https://requirejs.org/docs/whyamd.html#commonjs) kompatibel ist + +Module können andere Module laden und sich gegenseitig verwenden. Dazu nutzen sie spezielle Direktiven wie `import` und `export`, um Funktionalität auszutauschen und Funktionen aufzurufen: + +* `export` – markiert Funktionen und Variablen, die von außerhalb des aktuellen Moduls zugänglich sein sollen +* `import` – importiert Funktionalität aus einem externen Modul + +Sehen wir uns den Mechanismus von `import` und `export` in Modulen an. Die Funktion `sayHi` wird aus der Datei `sayHi.js` exportiert: + +```javascript +// 📁 sayHi.js +export const sayHi = (user) => { + alert(`Hello, ${user}!`); +} +``` + +Die Funktion `sayHi` wird in der Datei `main.js` mithilfe der Direktive `import` verwendet: + +```javascript +// 📁 main.js +import {sayHi} from './sayHi.js'; + +alert(sayHi); // function... +sayHi('Kelvin'); // Hello, Kelvin! +``` + +Hier lädt die `import`-Direktive das Modul über den relativen Pfad und weist die Variable `sayHi` zu. + +Module können auf zwei Arten exportiert werden: **Named** (benannter Export) und **Default** (Standardexport). Zudem können benannte Exporte inline oder gesammelt angegeben werden: + +```javascript +// 📁 person.js + +// inline benannte Exporte +export const name = "Kelvin"; +export const age = 30; + +// gesammelt +const name = "Kelvin"; +const age = 30; +export {name, age}; +``` + +{% hint style="warning" %} +Eine Datei darf nur einen einzigen Standard-`export` enthalten. +{% endhint %} + +// 📁 message.js
+const message = (name, age) => {
+ return `${name} is ${age} years old.`;
+};
+export default message;
+
+
+Je nach Exporttyp importieren wir auf zwei verschiedene Weisen. Benannte Exporte werden in geschweiften Klammern angegeben, während Standardexporte ohne Klammern importiert werden:
+
+```javascript
+import { name, age } from "./person.js"; // Import eines benannten Exports
+import message from "./message.js"; // Import eines Standardexports
+```
+
+Beim Zuweisen von Modulen sollte man *zirkuläre Abhängigkeiten* vermeiden. Eine zirkuläre Abhängigkeit entsteht, wenn Modul `A` von `B` abhängt und `B` wiederum direkt oder indirekt von `A` abhängig ist.
diff --git a/de/regular-expression.md b/de/regular-expression.md
new file mode 100644
index 00000000..0adc58d2
--- /dev/null
+++ b/de/regular-expression.md
@@ -0,0 +1,271 @@
+---
+layout: editorial
+Kapitel: 14
+Seite: 89
+Beschreibung: Ein regulärer Ausdruck, oft als "RegEx" abgekürzt, ist ein leistungsstarkes Werkzeug zum Musterabgleich und zur Suche innerhalb von Zeichenfolgen. Es bietet eine prägnante und flexible Möglichkeit, Text basierend auf bestimmten Mustern zu durchsuchen, abzugleichen und zu manipulieren.
+---
+
+# Kapitel 14
+# Regulärer Ausdruck
+
+Ein regulärer Ausdruck ist ein Objekt, das entweder mit dem `RegExp`-Konstruktor erstellt werden kann oder als Literalwert, indem ein Muster in Schrägstriche `(/)` eingeschlossen wird. Die Syntaxen zum Erstellen eines regulären Ausdrucks sind unten gezeigt.
+
+```javascript
+// Verwendung des regulären Ausdrucks-Konstruktors
+new RegExp(pattern[, flags]);
+
+// Verwendung von Literalen
+/pattern/flags
+```
+
+Die Flags sind optional beim Erstellen eines regulären Ausdrucks mit Literalen. Beispiel für die Erstellung eines identischen regulären Ausdrucks mit den oben genannten Methoden:
+
+```javascript
+let re1 = new RegExp("xyz");
+let re2 = /xyz/;
+```
+
+Beide Methoden erzeugen ein Regex-Objekt und haben die gleichen Methoden und Eigenschaften. Es gibt Fälle, in denen wir dynamische Werte zum Erstellen eines regulären Ausdrucks benötigen – in diesem Fall funktionieren Literale nicht und wir müssen den Konstruktor verwenden.
+
+{% hint style="info" %}
+In Fällen, in denen wir einen Schrägstrich als Teil eines regulären Ausdrucks haben möchten, müssen wir den Schrägstrich `(/)` mit einem Backslash `(\)` maskieren.
+{% endhint %}
+
+Die verschiedenen Modifikatoren, die verwendet werden, um eine Groß-/Kleinschreibung-unabhängige Suche durchzuführen, sind:
+
+* `g` – globale Suche (findet alle Übereinstimmungen, anstatt nach der ersten Übereinstimmung zu stoppen)
+
+Beispiel :
+
+```javascript
+const str = "Hello world, hello again!";
+const regex = /hello/gi;
+const matches = str.match(regex);
+// Wenn du über .match() nachdenkst, lies das hier 👇
+// Es ist eine eingebaute Methode in JavaScript, die verwendet wird, um eine Zeichenkette nach einem Ausdruck abzugleichen. Wenn eine Übereinstimmung gefunden wird, gibt sie ein Array aller gefundenen Übereinstimmungen zurück.
+// Wenn nicht, gibt die .match()-Methode null zurück.
+
+console.log(matches); // ["Hello", "hello"]
+```
+
+* `i` – Suche ohne Beachtung der Groß-/Kleinschreibung
+
+Beispiel :
+
+```javascript
+const str = "HeLlO WoRlD";
+const regex = /hello/i;
+const match = regex.test(str);
+// Die .test()-Methode gibt einen booleschen Wert zurück:
+// true, wenn eine Übereinstimmung gefunden wird, und false, wenn nicht.
+
+console.log(match); // true
+```
+
+* `m` – mehrzeiliges Matching
+
+Beispiel :
+
+```javascript
+const str = "This is a\nmultiline string.";
+const regex = /./mg;
+const matches = str.match(regex);
+// Das m-Flag wird verwendet, um Zeilenumbrüche (\n) abzugleichen.
+// Das bedeutet, dass der RegEx alle 26 Zeichen in der Zeichenkette abgleicht,
+// einschließlich des Zeilenumbruchs.
+
+console.log(matches.length); // 26
+```
+
+*Klammern* werden in einem regulären Ausdruck verwendet, um einen Zeichenbereich zu finden. Einige davon sind unten aufgeführt.
+
+* `[abc]` – findet jedes Zeichen zwischen den Klammern
+
+Beispiel :
+
+```javascript
+const str = "The cat and the dog are both animals.";
+const regex = /[abc]/g;
+const matches = str.match(regex);
+
+console.log(matches); // Array aller Vorkommen von a, b und c
+
+[
+ 'c', 'a', 'a',
+ 'a', 'b', 'a',
+ 'a'
+]
+```
+
+* `[^abc]` – findet jedes Zeichen, das nicht zwischen den Klammern ist
+
+Beispiel :
+
+```javascript
+const str = "The cat and dog.";
+const regex = /[^abc]/g; // Findet jedes Zeichen, das nicht 'a', 'b' oder 'c' ist
+const matches = str.match(regex);
+
+console.log(matches); // Array aller Vorkommen von Zeichen, die nicht 'a', 'b' oder 'c' sind
+
+[
+ 'T', 'h', 'e', ' ',
+ 't', ' ', 'n', 'd',
+ ' ', 'd', 'o', 'g',
+ '.'
+]
+
+```
+
+
+
+* `[0-9]` – findet jede Ziffer zwischen den Klammern
+
+Beispiel :
+
+```javascript
+const str = "The price of the item is $25, but it may change to $30.";
+const regex = /[0-9]/g; // Findet jede Ziffer von 0 bis 9
+const matches = str.match(regex);
+
+console.log(matches); // Array aller Ziffernvorkommen
+
+[
+ '2', '5', '3', '0'
+]
+
+```
+
+* `[^0-9]` – findet jedes Zeichen, das nicht zwischen den Klammern ist (keine Ziffer)
+
+Beispiel:
+
+```javascript
+const str = "The price is $25.";
+const regex = /[^0-9]/g; // Findet jedes Zeichen, das keine Ziffer ist
+const matches = str.match(regex);
+
+console.log(matches); // Array aller Vorkommen von Nicht-Ziffern
+
+[
+ 'T', 'h', 'e', ' ',
+ 'p', 'r', 'i', 'c',
+ 'e', ' ', 'i', 's',
+ ' ', '$', '.'
+]
+
+```
+
+*`(x|y)`– findet eines der Alternativen, getrennt durch ein `|`
+
+Beispiel:
+
+```javascript
+const str = "The words 'xylophone' and 'yellow' contain the letters 'x' and 'y'.";
+const regex = /(x|y)/g; // Findet entweder 'x' oder 'y'
+const matches = str.match(regex);
+
+console.log(matches); // Array aller Vorkommen von 'x' oder 'y'
+
+[
+ 'x', 'y', 'y', 'x', 'x', 'y'
+]
+
+```
+
+Metazeichen sind Sonderzeichen, die in regulären Ausdrücken eine besondere Bedeutung haben. Hier eine Übersicht:
+
+| Metazeichen | Beschreibung |
+| ----------- | ---------------------------------------------------------------------- |
+| `.` | Entspricht einem beliebigen Zeichen außer Zeilenumbruch oder Begrenzer |
+| `\w` | Entspricht einem Wortzeichen (alphanumerisch: `[a-zA-Z0–9_]`) |
+| `\W` | Entspricht einem Nicht-Wortzeichen (wie `[^a-zA-Z0–9_]`) |
+| `\d` | Entspricht einer Ziffer (wie `[0-9]`) |
+| `\D` | Entspricht einem Nicht-Ziffernzeichen |
+| `\s` | Entspricht einem Leerzeichen (z. B. Space, Tab) |
+| `\S` | Entspricht einem Nicht-Leerzeichen |
+| `\b` | Entspricht dem Anfang oder Ende eines Wortes |
+| `\B` | Entspricht **nicht** dem Anfang oder Ende eines Wortes |
+| `\0` | Entspricht einem `NULL`-Zeichen |
+| `\n` | Entspricht einem Zeilenumbruch |
+| `\f` | Entspricht einem Form-Feed-Zeichen |
+| `\r` | Entspricht einem Wagenrücklauf |
+| `\t` | Entspricht einem Tabulator |
+| `\v` | Entspricht einem vertikalen Tabulator |
+| `\xxx` | Entspricht einem Zeichen im Oktal-Format `xxx` |
+| `\xdd` | Entspricht einem Zeichen im Hexadezimal-Format `dd` |
+| `\udddd` | Entspricht einem Unicode-Zeichen im Hexadezimalformat `dddd` |
+
+Eigenschaften und Methoden, die von RegEx unterstützt werden:
+
+| Name | Beschreibung |
+| ------------- | --------------------------------------------------------------------- |
+| `constructor` | Gibt die Funktion zurück, die den RegExp-Prototyp erstellt hat |
+| `exec()` | Testet einen Treffer und gibt den ersten zurück (sonst `null`) |
+| `global` | Prüft, ob das `g`-Modifikator gesetzt ist |
+| `ignoreCase` | Prüft, ob das `i`-Modifikator gesetzt ist |
+| `lastIndex` | Gibt den Index an, ab dem die nächste Suche beginnt |
+| `multiline` | Prüft, ob das `m`-Modifikator gesetzt ist |
+| `source` | Gibt den ursprünglichen Text des Musters zurück |
+| `test()` | Testet, ob ein Treffer existiert, und gibt `true` oder `false` zurück |
+| `toString()` | Gibt das Muster als Zeichenkette zurück |
+
+{% hint style="warning" %}
+Eine `compile()` Methode zum Kompilieren eines regulären Ausdrucks ist veraltet. Sie war früher nützlich, um bestehende RegEx-Objekte neu zu konfigurieren, ist aber heute durch direktes Neuerstellen überflüssig.
+{% endhint %}
+
+### Ein häufiges Beispiel für reguläre Ausdrücke
+
+```javascript
+let text = "The best things in life are free";
+let result = /e/.exec(text); // sucht nach einem "e" in einem String
+console.log(result); // Ausgabe: ["e", 2, "The best things in life ar...]
+
+
+let helloWorldText = "Hello world!";
+// Suche nach "Hello"
+let pattern1 = /Hello/g;
+let result1 = pattern1.test(helloWorldText);
+// result1: true
+
+let pattern1String = pattern1.toString();
+// pattern1String : '/Hello/g'
+```
+
+### Ein Praxisbeispiel: PLZ-Prüfung mit RegEx
+
+```javascript
+const handleSubmit = (e) => {
+ // Verhindert das automatische Absenden des Formulars
+ e.preventDefault();
+
+ // Definiert eine Liste gültiger Postleitzahlen
+ const validPincodes = [
+ 110001, 110002, 110003, 110004, 110005, 110006, 110007, 110008, 110009,
+ 110010, 110011, 110012, 110013, 110014, 110015, 110016, 110017, 110018,
+ 110019, 110020, 110021, 110022, 110023, 110050, 110051, 110056, 110048,
+ 110057, 110058, 110059, 110060, 110061, 110062, 110063, 110064
+ ];
+
+ // Umwandlung der Postleitzahlen in Zeichenketten
+ const validPincodeStrings = validPincodes.map((pincode) => String(pincode));
+
+ // Erzeugt ein RegEx-Muster, das nur gültige PLZ zulässt
+ const regexPattern = new RegExp(`^(${validPincodeStrings.join("|")})$`);
+
+ // Bekommt die PLZ vom Eingabefeld
+ const submittedPincode = pincode; // 'pincode' muss irgendwo definiert sein
+
+ // Prüfung, ob die eingegebne PLZ ein gültiges Eingabemuster ist
+ if (regexPattern.test(submittedPincode)) {
+ // Erfolgsmeldung anzeigen
+ // ...
+ } else if (submittedPincode === "") {
+ // Fehlermeldung bei leerer Eingabe
+ // ...
+ } else if (submittedPincode.length < 6) {
+ // Fehlermeldung bei falscher Eingabelänge
+ // ...
+ }
+}
+```
diff --git a/de/resources.md b/de/resources.md
new file mode 100644
index 00000000..52a040e1
--- /dev/null
+++ b/de/resources.md
@@ -0,0 +1,72 @@
+---
+Seite: V
+Kapitel:
+---
+# Lernressourcen
+
+## Artikel zum Erlernen von JavaScript
+
+1. Referenz zum Document Object Model [Link](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model)
+
+2. Einführung in Events [Link](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events)
+
+3. Einführung in JavaScript von Hostinger [Link](https://www.hostinger.com/tutorials/what-is-javascript)
+
+4. Einführung in JavaScript von Microverse [Link](https://www.microverse.org/blog/introduction-to-javascript-a-guide-for-beginners)
+
+5. JavaScript-Grundlagen von Mozilla Developer [Link](https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics)
+
+6. JavaScript-Tutorial von Geeks for Geeks [Link](https://www.geeksforgeeks.org/javascript/)
+
+7. JavaScript-Tutorial von Stackify [Link](https://stackify.com/learn-javascript-tutorials/)
+
+8. JavaScript-Referenz zum HTML-DOM [Link](https://www.w3schools.com/js/js_htmldom.asp)
+
+9. Was ist das DOM? (CSS-Tricks) [Link](https://css-tricks.com/dom/)
+
+## Bücher zum Erlernen von JavaScript
+
+
+
+1. A Smarter Way to Learn JavaScript – Mark Myers [Link](https://www.amazon.in/Smarter-Way-Learn-JavaScript-technology-ebook/dp/B00H1W9I6C)
+
+2. Eloquent JavaScript – Marijn Haverbeke [Link](https://www.amazon.in/Eloquent-JavaScript-3rd-Introduction-Programming-ebook/dp/B07C96Q217)
+
+3. Head First JavaScript [Link](https://www.amazon.com/Head-First-JavaScript-Programming-Brain-Friendly/dp/144934013X?tag=javamysqlanta-20)
+
+4. JavaScript: The Good Parts – Douglas Crockford [Link](https://www.amazon.in/Javascript-Good-Parts-D-Crockford/dp/0596517742)
+
+5. Professional JavaScript for Web Developers [Link](https://www.amazon.com/dp/1118026691)
+
+6. Secrets of the JavaScript Ninja [Link](https://www.amazon.com/Secrets-JavaScript-Ninja-John-Resig/dp/193398869X?tag=javamysqlanta-20)
+
+7. The Principles of Object-Oriented JavaScript [Link](https://www.amazon.com/Principles-Object-Oriented-JavaScript-Nicholas-Zakas/dp/1593275404?tag=javamysqlanta-20)
+
+8. You Don’t Know JS – Kyle Simpson [Link](https://www.amazon.in/You-Dont-Know-Set-Volumes/dp/9352136268)
+
+## YouTube-Kanäle zum Lernen von JavaScript
+
+1. Academind – [Link](https://www.youtube.com/c/Academind)
+2. Akshay Saini – [Link](https://www.youtube.com/@akshaymarch7)
+3. Clever Programmer – [Link](https://www.youtube.com/@CleverProgrammer)
+4. CodeWithHarry – [Link](https://www.youtube.com/c/CodeWithHarry)
+5. Dave Gray – [Link](https://www.youtube.com/@DaveGrayTeachesCode)
+6. freeCodeCamp – [Link](https://www.youtube.com/c/Freecodecamp)
+7. JavaScript Mastery – [Link](https://www.youtube.com/@javascriptmastery)
+8. SuperSimpleDev – [Link](https://www.youtube.com/@SuperSimpleDev)
+9. The Net Ninja – [Link](https://www.youtube.com/channel/UCW5YeuERMmlnqo4oq8vwUpg)
+10. thenewboston – [Link](https://www.youtube.com/@thenewboston)
+11. Traversy Media – [Link](https://www.youtube.com/user/TechGuyWeb)
+
+## Projekte zum Üben
+
+- [Digitale Uhr](./beginner-projects/digital-clock.md)
+- [Elektronisches Schlagzeug](./beginner-projects/electronic-drum-kit.md)
+- [Bildersuche](./beginner-projects/image-search.md)
+- [Monatskalender](./beginner-projects/monthly-calendar.md)
+- [Zufällige Fotos](./beginner-projects/random-photos-generator.md)
+- [Schere-Stein-Papier-Spiel](./beginner-projects/rock-paper-scissors-game.md)
+- [Stoppuhr](./beginner-projects/simple-stopwatch.md)
+- [Trinkgeldrechner](./beginner-projects/tip-calculator.md)
+- [Video-Trailer-Popup](./beginner-projects/video-trailer-popup.md)
+- [Wetter-App](./beginner-projects/weather-app.md)