
Hallo habrozhiteli! In diesem Buch können Sie tief in das Thema eintauchen und lernen, wie man schönen und effektiven Code schreibt. Sie lernen Syntax, Pfeil- und asynchrone Funktionen, Iterator, Musterzeichenfolgen und Blockbereich kennen.
Marein Haverbeke - Praktizierende. Sammeln Sie Erfahrungen und lernen Sie die Sprache anhand einer Vielzahl von Beispielen durch Ăbungen und Trainingsprojekte. ZunĂ€chst werden Sie mit der Struktur der JavaScript-Sprache vertraut gemacht, Strukturen, Funktionen und Datenstrukturen verwalten, dann Fehlerbehandlung und Fehlerbehebungen, ModularitĂ€t und asynchrone Programmierung untersuchen und dann mit der Browserprogrammierung fortfahren.
ĂberprĂŒfen Sie dieses Buch
Dieses Buch ist in drei groĂe Teile gegliedert. In den ersten 12 Kapiteln wird die JavaScript-Sprache erlĂ€utert. In den nĂ€chsten sieben Kapiteln geht es um Browser und wie sie mit JavaScript programmiert werden. SchlieĂlich sind zwei Kapitel Node.js gewidmet, einer anderen JavaScript-Programmierumgebung.
Im gesamten Buch werden Sie fĂŒnf Kapitel von Projekten kennenlernen, in denen gröĂere Beispiele fĂŒr Programme beschrieben werden, damit Sie den Geschmack einer echten Programmierung spĂŒren können. In der Reihenfolge ihres Auftretens werden wir daran arbeiten, einen Bereitstellungsroboter, eine Programmiersprache, eine Spieleplattform, einen Raster-Grafikeditor und eine dynamische Site zu erstellen.
Der sprachliche Teil des Buches beginnt mit vier Kapiteln, die Sie in die Grundstruktur der JavaScript-Sprache einfĂŒhren. Sie lernen Kontrollstrukturen (wie das SchlĂŒsselwort while, das Sie bereits in der EinfĂŒhrung gesehen haben), Funktionen (Schreiben eigener Bausteine) und Datenstrukturen kennen. Danach können Sie die einfachsten Programme schreiben. DarĂŒber hinaus wird in den Kapiteln 5 und 6 beschrieben, wie Funktionen und Objekte verwendet werden, um abstrakteren Code zu schreiben und dessen KomplexitĂ€t zu steuern.
Nach dem Kapitel des ersten Projekts wird der sprachliche Teil des Buches fortgesetzt. Die folgenden Kapitel befassen sich mit der Erkennung und Korrektur von Fehlern, regulĂ€ren AusdrĂŒcken (ein wichtiges Werkzeug fĂŒr die Arbeit mit Text), ModularitĂ€t (eine weitere Verteidigung gegen KomplexitĂ€t) und asynchroner Programmierung (Arbeit mit Ereignissen, die fĂŒr einige von Dauer sind Zeit). Der erste Teil des Buches wird durch das Kapitel des zweiten Entwurfs vervollstĂ€ndigt.
Der zweite Teil, Kapitel 13 bis 19, beschreibt die Tools, auf die ein JavaScript-fĂ€higer Browser Zugriff hat. Sie lernen, wie Sie Elemente auf dem Bildschirm anzeigen (Kapitel 14 und 17), auf Benutzereingaben reagieren (Kapitel 15) und diese ĂŒber das Netzwerk freigeben (Kapitel 18). Dieser Teil enthĂ€lt auch zwei Kapitel von Projekten.
Danach wird Node.js in Kapitel 20 beschrieben und eine kleine Site in Kapitel 21 mit dem angegebenen Tool erstellt.
Auszug. Summation mit reduzieren
Eine andere hĂ€ufige Sache, die hĂ€ufig mit Arrays gemacht wird, ist die Berechnung eines einzelnen Werts basierend auf diesen. Ein Sonderfall hierfĂŒr ist das Beispiel, das wir bereits fĂŒr die Summierung einer Reihe von Zahlen verwendet haben. Ein weiteres Beispiel ist das Finden der Schriftart mit den meisten Zeichen.
Eine Operation höherer Ordnung, die dieses Muster implementiert, wird als Kurzform (manchmal auch als Faltung bezeichnet) bezeichnet. Diese Operation erstellt den Wert, indem wiederholt ein Element aus dem Array abgerufen und mit dem aktuellen Wert kombiniert wird. Wenn wir die Zahlen summieren, beginnen wir bei Null und addieren dann jedes nachfolgende Element zur Summe.
Die Parameter der Reduktionsfunktion sind zusÀtzlich zum Array eine Kombinationsfunktion und ein Anfangswert. Diese Funktion ist etwas komplizierter als Filter und Map. Schauen Sie sie sich also genauer an:
function reduce(array, combine, start) { let current = start; for (let element of array) { current = combine(current, element); } return current; } console.log(reduce([1, 2, 3, 4], (a, b) => a + b, 0));
Die Standardmethode zum Arbeiten mit reduzierten Arrays, die natĂŒrlich dieser Funktion entspricht, bietet zusĂ€tzlichen Komfort. Wenn das Array mindestens ein Element enthĂ€lt, können Sie das Startargument weglassen. Die Methode wĂ€hlt das erste Element des Arrays als Anfangswert aus und beginnt mit der Reduzierung ab dem zweiten Element.
console.log([1, 2, 3, 4].reduce((a, b) => a + b));
Um mit reduz (zweimal) die Schriftart mit den meisten Zeichen zu finden, können wir Folgendes schreiben:
function characterCount(script) { return script.ranges.reduce((count, [from, to]) => { return count + (to â from); }, 0); } console.log(SCRIPTS.reduce((a, b) => { return characterCount(a) < characterCount(b) ? b : a; }));
Die CharacterCount-Funktion reduziert die dieser Schriftart zugewiesenen Bereiche, indem sie die Summe ihrer GröĂen berechnet. Achten Sie auf die Verwendung der Destrukturierung in der Liste der Parameter der Reduktionsfunktion. Beim zweiten Aufruf zum Reduzieren wird das vorherige Ergebnis verwendet, um die gröĂte Schriftart zu finden. Dabei werden die beiden Schriftarten wiederholt verglichen und die gröĂere zurĂŒckgegeben.
Der Han-Schriftart sind im Unicode-Standard ĂŒber 89.000 Zeichen zugewiesen. Damit ist sie das gröĂte Schriftsystem in unserem Datensatz. Han ist eine Schriftart, die manchmal fĂŒr chinesische, japanische und koreanische Texte verwendet wird. Ihre Sprachen haben viele gemeinsame Zeichen, obwohl sie unterschiedlich geschrieben sind. Das Unicode-Konsortium (in den USA ansĂ€ssig) hat beschlossen, solche Zeichen als ein einziges Aufzeichnungssystem zu betrachten, um Zeichencodes zu speichern. Dies nennt man Han-Vereinigung und ist fĂŒr manche Menschen immer noch sehr Ă€rgerlich.
Zusammensetzbarkeit
Denken wir mal: Wie könnten wir das vorherige Beispiel (die gröĂte Schriftart finden) ohne Funktionen höherer Ordnung umschreiben? Der folgende Code ist nicht viel schlimmer.
let biggest = null; for (let script of SCRIPTS) { if (biggest == null || characterCount(biggest) < characterCount(script)) { biggest = script; } } console.log(biggest);
Es erschienen mehrere zusÀtzliche Bindungen, und das Programm wurde vier Zeilen lÀnger. Aber dieser Code ist immer noch ziemlich klar.
Funktionen höherer Ordnung sind sehr nĂŒtzlich, wenn Sie Operationen erstellen mĂŒssen. Als Beispiel schreiben wir einen Code, der das durchschnittliche Jahr der Erstellung von Schriftarten lebender und toter Sprachen in einem Datensatz berechnet.
function average(array) { return array.reduce((a, b) => a + b) / array.length; } console.log(Math.round(average( SCRIPTS.filter(s => s.living).map(s => s.year))));
Daher sind Skripte toter Sprachen in Unicode im Durchschnitt Àlter als Skripte lebender Sprachen.
Dies sind keine besonders signifikanten oder ĂŒberraschenden Statistiken. Aber Sie stimmen hoffentlich zu, dass der zur Berechnung verwendete Code leicht zu lesen ist. Dies kann man sich als Förderer vorstellen: Wir analysieren zunĂ€chst alle Schriftarten, filtern die Lebenden (oder Toten) heraus, nehmen die Jahre ihrer Erstellung, berechnen den Durchschnittswert und runden das Ergebnis ab.
Diese Berechnung könnte auch als ein groĂer Zyklus dargestellt werden.
let total = 0, count = 0; for (let script of SCRIPTS) { if (script.living) { total += script.year; count += 1; } } console.log(Math.round(total / count));
In diesem Code ist es jedoch schwieriger zu verstehen, was und wie berechnet wird. Und da die Zwischenergebnisse nicht als konsistente Werte dargestellt werden, mĂŒsste viel mehr Arbeit geleistet werden, um so etwas wie den Durchschnitt in eine separate Funktion zu trennen.
In Bezug auf die tatsĂ€chliche Funktionsweise des Computers unterscheiden sich diese beiden AnsĂ€tze ebenfalls grundlegend. Der erste erstellt neue Arrays, wenn Filter und Map ausgefĂŒhrt werden, wĂ€hrend der zweite nur einige Zahlen berechnet und weniger Arbeit erledigt. Normalerweise können Sie sich eine besser lesbare Option leisten. Wenn Sie jedoch sehr groĂe Arrays verarbeiten und mehrmals ausfĂŒhren mĂŒssen, kann ein weniger abstrakter Stil zu einem zusĂ€tzlichen Geschwindigkeitsgewinn fĂŒhren.
Zeichenfolgen und Zeichencodes
Eine Verwendung von DatensĂ€tzen besteht darin, zu bestimmen, in welche Schriftart ein bestimmtes TextstĂŒck eingegeben wird. Schauen wir uns ein Programm an, das dies tut.
Denken Sie daran, dass es fĂŒr jede Schriftart ein Array von Zeichencodebereichen gibt. Wenn wir den Zeichencode kennen, können wir die folgende Funktion verwenden, um die entsprechende Schriftart (falls vorhanden) zu finden:
function characterScript(code) { for (let script of SCRIPTS) { if (script.ranges.some(([from, to]) => { return code >= from && code < to; })) { return script; } } return null; } console.log(characterScript(121));
Die Methode some ist eine weitere Funktion höherer Ordnung. Es nimmt eine Testfunktion und meldet, ob es fĂŒr ein Element des Arrays true zurĂŒckgibt.
Aber wie bekommen wir Zeichencodes als Zeichenfolge?
In Kapitel 1 habe ich erwÀhnt, dass Zeichenfolgen in JavaScript als Sequenzen von 16-Bit-Zahlen dargestellt werden. Dies sind die sogenannten Codeeinheiten. Anfangs wurde angenommen, dass in Unicode der Zeichencode in einem solchen Block platziert wird (was etwas mehr als 65.000 Zeichen ergibt). Als klar wurde, dass dies nicht ausreichte, lehnten viele die Notwendigkeit ab, mehr Speicher zum Speichern eines Zeichens zu verwenden. Um dieses Problem zu lösen, wurde das in JavaScript-Strings verwendete UTF-16-Format erfunden. Darin belegen die hÀufigsten Zeichen eine 16-Bit-Codeeinheit und der Rest zwei Codeeinheiten.
Heute ist allgemein anerkannt, dass UTF-16 eine schlechte Idee war. Es scheint geschaffen zu sein, um Fehler zu erzeugen. Sie können leicht ein Programm schreiben, fĂŒr das die Codeeinheiten und Zeichen ein und dasselbe sind. Und wenn Ihre Muttersprache keine Zeichen verwendet, die zwei Codeeinheiten belegen, funktioniert dieses Programm einwandfrei. Sobald jedoch jemand versucht, ein solches Programm fĂŒr ein weniger verbreitetes Alphabet zu verwenden, beispielsweise fĂŒr chinesische Schriftzeichen, wird es sofort unterbrochen. GlĂŒcklicherweise wurden nach dem Aufkommen von Emoticons ĂŒberall zwei Codeeinheiten fĂŒr die Zeichenkodierung verwendet, und die Last der Lösung solcher Probleme wurde gerechter verteilt.
Leider behandeln offensichtliche Operationen mit JavaScript-Zeichenfolgen, z. B. das Abrufen ihrer LĂ€nge ĂŒber die Eigenschaft length und der Zugriff auf deren Inhalt in eckigen Klammern, nur Codeeinheiten.

Die JavaScript-Methode charCodeAt gibt nicht den vollstĂ€ndigen Zeichencode zurĂŒck, sondern eine Codeeinheit. Die spĂ€ter angezeigte codePointAt-Methode gibt das vollstĂ€ndige Unicode-Zeichen zurĂŒck. Wir könnten dies also verwenden, um Zeichen aus einer Zeichenfolge abzurufen. Das an codePointAt ĂŒbergebene Argument ist jedoch immer noch ein Index in einer Folge von Codeeinheiten. Um also alle Zeichen in einer Zeichenfolge zu durchlaufen, mĂŒssen wir noch die Frage lösen, ob eine oder zwei Codeeinheiten ein Zeichen belegen.
Im vorherigen Kapitel habe ich erwĂ€hnt, dass die for / of-Schleife auch fĂŒr Zeichenfolgen verwendet werden kann. Wie codePointAt trat diese Art von Schleife zu einer Zeit auf, als Programmierer die Probleme von UTF-16 klar erkannten. Wenn Sie diese Schleife auf eine Zeichenfolge anwenden, werden echte Zeichen und keine Codeeinheiten angegeben.

Wenn Sie ein Zeichen haben (das eine Zeichenfolge aus einer oder zwei Codeeinheiten ist), können Sie codePointAt (0) verwenden, um den Code abzurufen.
Texterkennung
Wir haben eine CharacterScript-Funktion und eine Möglichkeit, Zeichen in einer Schleife korrekt aufzulisten. Der nÀchste Schritt besteht darin, die Anzahl der Zeichen zu zÀhlen, die zu jeder Schriftart gehören. Hier brauchen wir eine ZÀhlabstraktion:
function countBy(items, groupName) { let counts = []; for (let item of items) { let name = groupName(item); let known = counts.findIndex(c => c.name == name); if (known == -1) { counts.push({name, count: 1}); } else { counts[known].count++; } } return counts; } console.log(countBy([1, 2, 3, 4, 5], n => n > 2));
Die countBy-Funktion akzeptiert eine Sammlung (alles, was in einer for / of-Schleife sortiert werden kann) und eine Funktion, die den Gruppennamen fĂŒr ein bestimmtes Element berechnet. Die Funktion countBy gibt ein Array von Objekten zurĂŒck, von denen jedes den Namen der Gruppe und die Anzahl der dafĂŒr gefundenen Elemente enthĂ€lt.
Diese Funktion verwendet eine andere Methode zum Arbeiten mit Arrays - findIndex. Diese Methode Ă€hnelt indexOf, sucht jedoch nicht nach einem bestimmten Wert, sondern findet den ersten Wert, fĂŒr den die angegebene Funktion true zurĂŒckgibt. Wenn das Element nicht gefunden wird, gibt findIndex wie indexOf â1 zurĂŒck.
Mit countBy können wir eine Funktion schreiben, die angibt, welche Schriftarten in diesem Text verwendet wurden.

Die Funktion zĂ€hlt Zeichen zuerst nach Schriftartnamen und gibt ihnen mit CharacterScript einen Namen. FĂŒr Zeichen, die keiner Schriftart angehören, wird die Zeichenfolge "none" zurĂŒckgegeben. Durch das Aufrufen des Filters wird der Eintrag "none" aus dem resultierenden Array entfernt, da wir nicht an diesen Zeichen interessiert sind.
Um ProzentsĂ€tze berechnen zu können, mĂŒssen wir zuerst die Gesamtzahl der Zeichen ermitteln, die zu der Schriftart gehören, die wir mit der Reduzierungsmethode berechnen können. Wenn keine solchen Zeichen gefunden werden, gibt die Funktion eine bestimmte Zeichenfolge zurĂŒck. Andernfalls werden die ZĂ€hlergebnisse mithilfe von map in lesbare Zeichenfolgen konvertiert und anschlieĂend mithilfe von join kombiniert.
Zusammenfassung
Die Möglichkeit, Funktionswerte an andere Funktionen zu ĂŒbergeben, ist ein sehr nĂŒtzlicher Aspekt von JavaScript. Auf diese Weise können Sie Funktionen erstellen, die Berechnungen mit Leerzeichen simulieren. Wenn anschlieĂend solche Funktionen im Code aufgerufen werden, werden diese âLĂŒckenâ mit Funktionswerten gefĂŒllt.
FĂŒr Arrays gibt es eine Reihe nĂŒtzlicher Methoden höherer Ordnung. Die forEach-Methode kann verwendet werden, um die Elemente eines Arrays zu durchlaufen. Die Filtermethode gibt ein neues Array zurĂŒck, das nur Elemente enthĂ€lt, die die Bedingung der PrĂ€dikativfunktion erfĂŒllen. Die Array-Konvertierung durch AusfĂŒhren einer Funktion fĂŒr jedes Element erfolgt mithilfe von map. Um alle Elemente eines Arrays zu einem einzigen Wert zu kombinieren, können Sie Reduzieren verwenden. Die Methode some prĂŒft, ob ein Element mit einer bestimmten PrĂ€dikativfunktion ĂŒbereinstimmt. SchlieĂlich findet die findIndex-Methode die Position des ersten Elements, das dem PrĂ€dikat entspricht.
»Weitere Informationen zum Buch finden Sie auf
der Website des Herausgebers»
Inhalt»
Auszug25% Rabatt auf Gutschein fĂŒr HĂ€ndler -
JavaScriptNach Bezahlung der Papierversion des Buches wird ein elektronisches Buch per E-Mail verschickt.