JavaScript sprechen
Homepage
Das Buch kaufen
(Werbung, bitte nicht blockieren.)
Inhaltsverzeichnis
Lob für
JavaScript sprechen
Vorwort
Was Sie über dieses Buch wissen müssen
Tipps zum Lesen dieses Buches
Die vier Teile dieses Buches
JavaScript-Befehlszeilen
Notationelle Konventionen
Beschreibung der Syntax
Verweis auf Methoden
Befehlszeileninteraktion
Tipps, Notizen und Warnungen
Schnelles Finden von Dokumentation
Safari® Books Online
So kontaktieren Sie uns
Danksagungen
Vorbereitung auf JavaScript
Hilfe bei JavaScript
Rezensenten
I. JavaScript Schnellstart
1. Grundlegendes JavaScript
Hintergrund
JavaScript im Vergleich zu ECMAScript
Einflüsse und Natur der Sprache
Syntax
Überblick über die Syntax
Anweisungen im Vergleich zu Ausdrücken
Semikolons
Kommentare
Variablen und Zuweisung
Zuweisung
Verbundzuweisungsoperatoren
Bezeichner und Variablennamen
Werte
Primitive Werte im Vergleich zu Objekten
Primitive Werte
Objekte
undefined und null
Kategorisierung von Werten mit typeof und instanceof
Booleans
Truthy und Falsy
Binäre logische Operatoren
Gleichheitsoperatoren
Zahlen
Operatoren
Strings
String-Operatoren
String-Methoden
Anweisungen
Bedingte Anweisungen
Schleifen
Funktionen
Funktionsdeklarationen werden hochgezogen
Die spezielle Variable arguments
Zu viele oder zu wenige Argumente
Optionale Parameter
Erzwingen einer Stellenzahl
Argumente in ein Array konvertieren
Ausnahmebehandlung
Strikter Modus
Variablengültigkeitsbereiche und Closures
Variablen sind funktionsbezogen
Variablen werden hochgezogen
Closures
Das IIFE-Muster: Einführung eines neuen Geltungsbereichs
Objekte und Konstruktoren
Einzelne Objekte
Beliebige Eigenschaftsschlüssel
Methoden extrahieren
Funktionen innerhalb einer Methode
Konstruktoren: Fabriken für Objekte
Arrays
Array-Literale
Array-Methoden
Iterieren über Arrays
Reguläre Ausdrücke
Methode test(): Gibt es eine Übereinstimmung?
Methode exec(): Übereinstimmung und Erfassungsgruppen
Methode replace(): Suchen und Ersetzen
Math
Weitere Funktionalität der Standardbibliothek
II. Hintergrund
2. Warum JavaScript?
Ist JavaScript frei verfügbar?
Ist JavaScript elegant?
Ist JavaScript nützlich?
Grafische Benutzeroberflächen
Andere Technologien, die JavaScript ergänzen
Verfügt JavaScript über gute Werkzeuge?
Ist JavaScript schnell genug?
Wird JavaScript häufig verwendet?
Hat JavaScript eine Zukunft?
Schlussfolgerung
3. Die Natur von JavaScript
Eigenheiten und unkonventionelle Merkmale
Elegante Teile
Einflüsse
4. Wie JavaScript entstanden ist
5. Standardisierung: ECMAScript
6. Historische Meilensteine von JavaScript
III. JavaScript im Detail
7. Die Syntax von JavaScript
Überblick über die Syntax
Kommentare
Ausdrücke im Vergleich zu Anweisungen
Ausdrücke
Anweisungen
Kontrollflussanweisungen und Blöcke
Regeln für die Verwendung von Semikolons
Kein Semikolon nach einer Anweisung, die mit einem Block endet
Die leere Anweisung
Automatische Semikolon-Einfügung
Gültige Bezeichner
Aufrufen von Methoden auf numerischen Literalen
Strikter Modus
Umschalten auf strikten Modus
Strikter Modus: Empfohlen, mit Vorbehalten
Variablen müssen im strikten Modus deklariert werden
Funktionen im strikten Modus
Das Setzen und Löschen von unveränderlichen Eigenschaften führt im strikten Modus zu einer Ausnahme
Nicht qualifizierte Bezeichner können im strikten Modus nicht gelöscht werden
eval() ist im strikten Modus sauberer
Im strikten Modus verbotene Funktionen
8. Werte
Das Typsystem von JavaScript
Die Typen von JavaScript
Statisch im Vergleich zu Dynamisch
Statische Typisierung im Vergleich zu dynamischer Typisierung
Statische Typprüfung im Vergleich zu dynamischer Typprüfung
Koerzession
Primitive Werte im Vergleich zu Objekten
Primitive Werte
Objekte
undefined und null
Vorkommen von undefined und null
Prüfung auf undefined oder null
Die Geschichte von undefined und null
Änderung von undefined
Wrapper-Objekte für primitive Werte
Wrapper-Objekte unterscheiden sich von primitiven Werten
Primitive Werte wrappen und unwrappen
Primitive Werte leihen sich ihre Methoden von Wrappern
Typ-Koerzession
Typ-Koerzession kann Fehler verbergen
Funktionen zur Konvertierung in Boolean, Number, String und Object
Algorithmus: ToPrimitive()—Konvertieren eines Werts in einen primitiven Wert
9. Operatoren
Operatoren und Objekte
Zuweisungsoperatoren
Verbundzuweisungsoperatoren
Gleichheitsoperatoren: === im Vergleich zu ==
Strikte Gleichheit (===, !==)
Normale (lenient) Gleichheit (==, !=)
Es gibt keine gültigen Anwendungsfälle für ==
Ordnungsoperatoren
Der Algorithmus
Der Plus-Operator (+)
Der Algorithmus
Operatoren für Booleans und Zahlen
Spezialoperatoren
Der ternäre Operator ( ? : )
Der Komma-Operator
Der void-Operator
Werte kategorisieren über typeof und instanceof
typeof: Primitive kategorisieren
instanceof: Prüfen, ob ein Objekt eine Instanz eines gegebenen Konstruktors ist
Objektoperatoren
10. Booleans
Konvertierung in Boolean
Manuelle Konvertierung in Boolean
Wahrheitsgemäße und falsche Werte
Logische Operatoren
Binäre logische Operatoren: Und (&&) und Oder (||)
Logisches Und (&&)
Logisches Oder (||)
Logisches Nicht (!)
Gleichheitsoperatoren, Ordnungsoperatoren
Die Funktion Boolean
11. Zahlen
Zahlenliterale
Exponent
Methodenaufrufe auf Literalen
Konvertierung in Zahl
Manuelle Konvertierung in Zahl
parseFloat()
Spezielle Zahlenwerte
NaN
Infinity
Zwei Nullen
Die interne Darstellung von Zahlen
Spezielle Exponenten
Umgang mit Rundungsfehlern
Ganzzahlen in JavaScript
Bereiche von Ganzzahlen
Ganzzahlen als Gleitkommazahlen darstellen
Sichere Ganzzahlen
Konvertierung in Ganzzahl
Ganzzahlen über Math.floor(), Math.ceil() und Math.round()
Ganzzahlen über die benutzerdefinierte Funktion ToInteger()
32-Bit-Ganzzahlen über bitweise Operatoren
Ganzzahlen über parseInt()
Arithmetische Operatoren
Bitweise Operatoren
Hintergrundwissen
Bitweises Nicht-Operator
Binäre bitweise Operatoren
Bitweise Shift-Operatoren
Die Funktion Number
Number-Konstruktor-Eigenschaften
Number-Prototyp-Methoden
Number.prototype.toFixed(fractionDigits?)
Number.prototype.toPrecision(precision?)
Number.prototype.toString(radix?)
Number.prototype.toExponential(fractionDigits?)
Funktionen für Zahlen
Quellen für dieses Kapitel
12. Strings
String-Literale
Escaping in String-Literalen
Zeichenzugriff
Konvertierung in String
Manuelle Konvertierung in String
Strings vergleichen
Strings verketten
Verkettung: Der Plus-Operator (+)
Verkettung: Zusammenfügen eines Arrays von String-Fragmenten
Die Funktion String
String-Konstruktor-Methode
String-Instanz-Eigenschaft length
String-Prototyp-Methoden
Teilstrings extrahieren
Transformieren
Suchen und Vergleichen
Testen, Abgleichen und Ersetzen mit regulären Ausdrücken
13. Anweisungen
Variablen deklarieren und zuweisen
Die Körper von Schleifen und bedingten Anweisungen
Schleifen
Mechanismen zur Verwendung mit Schleifen
while
do-while
for
for-in
for each-in
Bedingte Anweisungen
if-then-else
switch
Die with-Anweisung
Syntax und Semantik
Die with-Anweisung ist veraltet
Die Begründung für die Veralterung
Die debugger-Anweisung
14. Ausnahmebehandlung
Was ist Ausnahmebehandlung?
Ausnahmebehandlung in JavaScript
throw
try-catch-finally
Beispiele
Error-Konstruktoren
Stack-Traces
Implementierung eines eigenen Error-Konstruktors
15. Funktionen
Die drei Rollen von Funktionen in JavaScript
Terminologie: „Parameter“ im Vergleich zu „Argument“
Funktionen definieren
Funktionsausdrücke
Funktionsdeklarationen
Der Function-Konstruktor
Hoisting
Der Name einer Funktion
Was ist besser: Eine Funktionsdeklaration oder ein Funktionsausdruck?
Mehr Kontrolle über Funktionsaufrufe: call(), apply() und bind()
func.apply(thisValue, argArray)
func.bind(thisValue, arg1, ..., argN)
Umgang mit fehlenden oder zusätzlichen Parametern
Alle Parameter nach Index: Die spezielle Variable arguments
Obligatorische Parameter, Erzwingen einer Mindestanzahl von Argumenten
Optionale Parameter
Simulation von Parameterübergabe per Referenz
Fallstrick: Unerwartete optionale Parameter
Benannte Parameter
Benannte Parameter als Beschreibungen
Optionale benannte Parameter
Simulation von benannten Parametern in JavaScript
16. Variablen: Gültigkeitsbereiche, Umgebungen und Closures
Eine Variable deklarieren
Hintergrund: Statisch im Vergleich zu dynamisch
Hintergrund: Der Geltungsbereich einer Variable
Variablen sind funktionsbezogen
Variablendeklarationen werden hochgezogen
Einführung eines neuen Geltungsbereichs über eine IIFE
IIFE-Variante: Präfixoperatoren
IIFE-Variante: Bereits im Ausdruckskontext
IIFE-Variante: Eine IIFE mit Parametern
IIFE-Anwendungen
Globale Variablen
Bewährte Methode: Vermeiden Sie die Erstellung globaler Variablen
Modulsysteme führen zu weniger globalen Variablen
Das globale Objekt
Plattformübergreifende Überlegungen
Anwendungsfälle für window
Umgebungen: Variablen verwalten
Closures: Funktionen bleiben mit ihren Erzeugungs-Geltungsbereichen verbunden
Closures über Umgebungen verwalten
Fallstrick: Unbeabsichtigtes Teilen einer Umgebung
17. Objekte und Vererbung
Ebene 1: Einzelne Objekte
Arten von Eigenschaften
Objektliterale
Punktoperator (.): Zugriff auf Eigenschaften über feste Schlüssel
Ungewöhnliche Eigenschaftsschlüssel
Klammeroperator ([]): Zugriff auf Eigenschaften über berechnete Schlüssel
Jeden Wert in ein Objekt konvertieren
this als impliziter Parameter von Funktionen und Methoden
Funktionen aufrufen, während this gesetzt wird: call(), apply() und bind()
apply() für Konstruktoren
Fallstrick: this verlieren, wenn eine Methode extrahiert wird
Fallstrick: Funktionen innerhalb von Methoden überschatten this
Ebene 2: Die Prototyp-Beziehung zwischen Objekten
Vererbung
Überschreiben
Daten zwischen Objekten über einen Prototyp teilen
Prototyp abrufen und setzen
Die spezielle Eigenschaft __proto__
Das Setzen und Löschen wirkt sich nur auf eigene Eigenschaften aus
Iterieren und Erkennen von Eigenschaften
Eigene Eigenschaftsschlüssel auflisten
Alle Eigenschaftsschlüssel auflisten
Prüfen, ob eine Eigenschaft existiert
Beispiele
Bewährte Methoden: Iterieren über eigene Eigenschaften
Accessors (Getter und Setter)
Accessors über ein Objektliteral definieren
Accessors über Eigenschaftsdeskriptoren definieren
Accessors und Vererbung
Eigenschaftsattribute und Eigenschaftsdeskriptoren
Eigenschaftsattribute
Eigenschaftsdeskriptoren
Eigenschaften über Deskriptoren abrufen und definieren
Ein Objekt kopieren
Eigenschaften: Definition im Vergleich zu Zuweisung
Vererbte schreibgeschützte Eigenschaften können nicht zugewiesen werden
Aufzählbarkeit: Bewährte Methoden
Objekte schützen
Erweiterungen verhindern
Sealing
Freezing
Fallstrick: Schutz ist flach
Ebene 3: Konstruktoren—Fabriken für Instanzen
Der new-Operator, implementiert in JavaScript
Terminologie: Die beiden Prototypen
Die constructor-Eigenschaft von Instanzen
Der instanceof-Operator
Tipps zur Implementierung von Konstruktoren
Daten in Prototyp-Eigenschaften
Vermeiden Sie Prototyp-Eigenschaften mit Anfangswerten für Instanz-Eigenschaften
Vermeiden Sie nicht-polymorphe Prototyp-Eigenschaften
Polymorphe Prototyp-Eigenschaften
Daten privat halten
Private Daten in der Umgebung eines Konstruktors (Crockford Privacy Pattern)
Private Daten in Eigenschaften mit gekennzeichneten Schlüsseln
Private Daten in Eigenschaften mit reifizierten Schlüsseln
Globale Daten über IIFEs privat halten
Ebene 4: Vererbung zwischen Konstruktoren
Instanz-Eigenschaften erben
Prototyp-Eigenschaften erben
Sicherstellen, dass instanceof funktioniert
Eine Methode überschreiben
Einen Super-Aufruf tätigen
Vermeiden Sie die hartcodierte Benennung des Super-Konstruktors
Beispiel: Konstruktor-Vererbung in Aktion
Beispiel: Die Vererbungshierarchie von integrierten Konstruktoren
Antipattern: Der Prototyp ist eine Instanz des Super-Konstruktors
Methoden aller Objekte
Konvertierung in primitiven Wert
Object.prototype.toLocaleString()
Prototyp-Vererbung und Eigenschaften
Generische Methoden: Methoden von Prototypen ausleihen
Zugriff auf Object.prototype und Array.prototype über Literale
Beispiele für das Aufrufen von Methoden generisch
Array-ähnliche Objekte und generische Methoden
Eine Liste aller generischen Methoden
Fallstricke: Ein Objekt als Map verwenden
Fallstrick 1: Vererbung beeinflusst das Lesen von Eigenschaften
Fallstrick 2: Überschreiben beeinflusst das Aufrufen von Methoden
Fallstrick 3: Die spezielle Eigenschaft __proto__
Das dict-Muster: Objekte ohne Prototypen sind bessere Maps
Bewährte Methoden
Spickzettel: Arbeiten mit Objekten
18. Arrays
Übersicht
Arrays sind Maps, keine Tupel
Arrays können auch Eigenschaften haben
Arrays erstellen
Der Array-Konstruktor
Mehrdimensionale Arrays
Array-Indizes
Der in-Operator und Indizes
Array-Elemente löschen
Array-Indizes im Detail
length
Die Länge eines Arrays manuell erhöhen
Die Länge eines Arrays verringern
Die maximale Länge
Löcher in Arrays
Löcher erzeugen
Sparse Arrays im Vergleich zu dichten Arrays
Welche Operationen ignorieren Löcher und welche berücksichtigen sie?
Löcher aus Arrays entfernen
Array-Konstruktor-Methode
Array-Prototyp-Methoden
Elemente hinzufügen und entfernen (destruktiv)
Elemente sortieren und umkehren (destruktiv)
Zahlen vergleichen
Strings vergleichen
Objekte vergleichen
Verketten, Slicen, Zusammenfügen (nicht-destruktiv)
Werte suchen (nicht-destruktiv)
Iteration (nicht-destruktiv)
Untersuchungsmethoden
Transformationsmethoden
Reduktionsmethoden
Fallstrick: Array-ähnliche Objekte
Bewährte Methoden: Iterieren über Arrays
19. Reguläre Ausdrücke
Syntax regulärer Ausdrücke
Atome: Allgemein
Atome: Zeichenklassen
Atome: Gruppen
Quantifizierer
Assertionen
Disjunktion
Unicode und reguläre Ausdrücke
Einen regulären Ausdruck erstellen
Literal im Vergleich zu Konstruktor
Flags
Instanz-Eigenschaften von regulären Ausdrücken
Beispiele für das Erstellen von regulären Ausdrücken
RegExp.prototype.test: Gibt es eine Übereinstimmung?
String.prototype.search: An welchem Index gibt es eine Übereinstimmung?
RegExp.prototype.exec: Erfassungsgruppen
Erste Übereinstimmung (Flag /g nicht gesetzt)
Alle Übereinstimmungen (Flag /g gesetzt)
String.prototype.match: Erfassungsgruppen oder Rückgabe aller übereinstimmenden Teilstrings
String.prototype.replace: Suchen und Ersetzen
Ersetzung ist ein String
Ersetzung ist eine Funktion
Probleme mit dem Flag /g
Tipps und Tricks
Text quoten
Fallstrick: Ohne Assertion (z. B. ^, $), ein regulärer Ausdruck wird überall gefunden
Alles oder nichts abgleichen
Lookbehind manuell implementieren
Regulärer Ausdruck Spickzettel
20. Daten
Der Date-Konstruktor
Date-Konstruktor-Methoden
Date-Prototyp-Methoden
Zeit-Einheiten-Getter und -Setter
Verschiedene Getter und Setter
Ein Datum in einen String konvertieren
Datumszeitformate
Datumsformate (keine Zeit)
Zeitformate (kein Datum)
Datumszeitformate
Zeitwerte: Daten als Millisekunden seit 1970-01-01
Ein Datum in eine Zahl konvertieren
21. Math
Math-Eigenschaften
Numerische Funktionen
Trigonometrische Funktionen
Andere Funktionen
22. JSON
Hintergrund
Datenformat
Geschichte
Grammatik
JSON.stringify(value, replacer?, space?)
Von JSON.stringify() ignorierte Daten
Die toJSON()-Methode
JSON.parse(text, reviver?)
Daten über Node-Besucher transformieren
JSON.stringify()
JSON.parse()
23. Standard-Globale Variablen
Konstruktoren
Error-Konstruktoren
Nicht-Konstruktor-Funktionen
Text kodieren und dekodieren
Zahlen kategorisieren und parsen
Dynamisches Auswerten von JavaScript-Code über eval() und new Function()
Code mit eval() auswerten
Code mit new Function() auswerten
eval() im Vergleich zu new Function()
Bewährte Methoden
Schlussfolgerung
Die Console API
Wie standardisiert ist die Console API über Engines hinweg?
Einfache Protokollierung
Prüfen und Zählen
Formatierte Protokollierung
Profiling und Timing
Namensräume und spezielle Werte
24. Unicode und JavaScript
Unicode-Geschichte
Wichtige Unicode-Konzepte
Code Points
Unicode-Kodierungen
JavaScript-Quellcode und Unicode
Quellcode intern
Quellcode extern
JavaScript-Strings und Unicode
Escape-Sequenzen
Verweis auf Astralebenen-Zeichen über Escapes
Zeichen zählen
Unicode-Normalisierung
JavaScript-Reguläre Ausdrücke und Unicode
Abgleich beliebiger Code-Einheiten und beliebiger Code Points
Bibliotheken
Empfohlene Lektüre und Quellennachweise für das Kapitel
25. Neu in ECMAScript 5
Neue Funktionen
Syntaktische Änderungen
Neue Funktionalität in der Standardbibliothek
Metaprogrammierung
Neue Methoden
JSON
Tipps für die Arbeit mit älteren Browsern
IV. Tipps, Werkzeuge und Bibliotheken
26. Ein Meta Code Style Guide
Bestehende Style Guides
Allgemeine Tipps
Code sollte konsistent sein
Code sollte leicht verständlich sein
Allgemein anerkannte Best Practices
Klammerstile
Literale gegenüber Konstruktoren bevorzugen
Nicht schlau sein
Akzeptable Cleverness
Umstrittene Regeln
Syntax
Variablen
Objektorientierung
Verschiedenes
Schlussfolgerung
27. Sprachmechanismen für das Debugging
28. Unterklassen von integrierten Objekten
Terminologie
Hindernis 1: Instanzen mit internen Eigenschaften
Workaround für Hindernis 1
Vorbehalte
Hindernis 2: Ein Konstruktor, der nicht als Funktion aufgerufen werden kann
Workaround für Hindernis 2
Eine weitere Lösung: Delegation
29. JSDoc: Generierung von API-Dokumentation
Die Grundlagen von JSDoc
Syntax
Typen benennen
Grundlegende Tags
Dokumentation von Funktionen und Methoden
Inline-Typinformationen („Inline-Doc-Kommentare“)
Dokumentation von Variablen, Parametern und Instanz-Eigenschaften
Klassen dokumentieren
Eine Klasse über eine Konstruktor-Funktion definieren
Eine Klasse über ein Objektliteral definieren
Eine Klasse über ein Objektliteral mit einer @constructs-Methode definieren
Unterklassenbildung
Weitere nützliche Tags
30. Bibliotheken
Shims im Vergleich zu Polyfills
Vier Sprachbibliotheken
Die ECMAScript Internationalization API
Die ECMAScript Internationalization API, Edition 1
Welche Art von Standard ist es?
Wann kann ich es verwenden?
Weiterführende Lektüre
Verzeichnisse für JavaScript-Ressourcen
31. Modulsysteme und Paketmanager
Modulsysteme
Paketmanager
Schnelle und einfache Module
32. Mehr Werkzeuge
33. Was als Nächstes tun?
Index
Über den Autor
Kolophon
Copyright