Das Math-Objekt – Programmieren lernen mit JavaScript – Thytos
Nächstes Video startet in 3 Sekunden.
Programmieren lernen mit JavaScript

Das Math-Objekt

In Java­Script gibt es ein sta­ti­sches Ob­jekt na­mens »Math«, das wich­ti­ge ma­the­ma­ti­schen Kon­stan­ten und Funk­tio­nen bereithält.

Das Math-Objekt in JavaScript ist kein gewöhnliches Objekt. Es hat keinen eigenen Konstruktor (was das ist, wird später in der Serie erklärt). Alle Methoden und Eigenschaften sind statisch.
Am Math-Objekt befinden sich wichtige mathematische Konstanten und Methoden.

Zum Beispiel die Zahl Pi.

Math.PI;
// => 3.141592653589793

Die Methoden min und max geben die kleinste bzw. größte Zahl der übergebenen Werte zurück.

Math.min(3,2,1,4,5);
// => 1

Math.max(3,2,1,4,5);
// => 5

Die Quadratwurzel (English: square root) wird mit der sqrt-Funktion errechnet.

Math.sqrt(25);
// => 5

Math.sqrt(9);
// => 3

Zahlen in Wörter übersetzen

Math beinhaltet auch eine Methode, um eine Zufallszahl zu generieren. Math.random() gibt eine zufällige Zahl zwischen 0 und 1 zurück.

Math.random();
// => 0.16175867209838568

Math.random();
// => 0.9708698968286598

Wird die Zahl mit 10 multipliziert, liegt die Zufallszahl nicht mehr zwischen 0 und 1, sondern zwischen 0 und 10.

Math.random() * 10;
// => 6.546774145124492

Math.random() * 10;
// => 1.338818475004373

Mit der parseInt-Funktion wird die Komma- in eine eine Ganzzahl konvertiert.

parseInt(Math.random() * 10);
// => 7

parseInt(Math.random() * 10);
// => 3

Diese Ganzzahl kann als Index in einem String verwendet werden. Erstellt einen String mit allen Buchstaben des Alphabets. Statt mit 10 multipliziert ihr die Zufallszahl mit der Länge des Strings.

var alphabet = "abcdefghijklmnopqrstuvwxyz";
alphabet[parseInt(Math.random() * alphabet.length)];
// => "q"

alphabet[parseInt(Math.random() * alphabet.length)];
// => "h"

alphabet[parseInt(Math.random() * alphabet.length)];
// => "t"

alphabet[parseInt(Math.random() * alphabet.length)];
// => "w"

Die Zufallszahl wurde auf diese Weise in einen Zufalls-Buchstaben übersetzt.

Ihr könnt eine Funktion schreiben, die aus einer Liste einen zufälligen Eintrag zurückgibt.

function rndEntry(list) {
  return list[parseInt(Math.random() * list.length)];
}

rndEntry(alphabet);
// => "s"

rndEntry(alphabet);
// => "k"

Die Funktion lässt sich nun auch auf andere Listen anwenden. Bspw. ein Array aus Wörtern.

var worte = "Sonnen Regen Schirm Eis Schnee Winter Bild".split(" ");

rndEntry(worte);
// => "Eis"

rndEntry(worte);
// => "Schirm"

rndEntry(worte);
// => "Winter"

Die Zufallszahl wurde hiermit in ein Zufallswort übersetzt.

Es können auch zwei Zufallsworte miteinander kombiniert werden, um ein ganz neues Wort zu schaffen.

rndEntry(worte) + rndEntry(worte);
// => "SonnenSchnee"

rndEntry(worte) + rndEntry(worte);
// => "SonnenEis"

rndEntry(worte) + rndEntry(worte);
// => "BildSchirm"

rndEntry(worte) + rndEntry(worte);
// => "SchneeRegen"

Wenn ihr die Kenntnisse, die ihr bisher in der Serie gesammelt habt, miteinander kombiniert, könnt ihr sehr viel aus einfach nur einer Zufallszahl herausholen. Spielt damit herum! Der Kreativität sind keine Grenzen gesetzt.

Das Math-Objekt als Namespace

In der objekt-orientierten Programmierung stellen Objekte in der Regel Instanzen einer Mustervorlage dar. Sie sind eine programmatische Darstellung eines oftmals realitätsnahen Konzepts. Sie haben Zustände und ermöglichen Interaktion.

Das ist beim Math-Objekt nicht der Fall. Die Methoden sind statisch, was bedeutet, dass sie keinen Bezug zur Instanz haben.

Das Math-Objekt ist deswegen weniger ein gutes Beispiel für OOP. Viel mehr ist es bloß ein Objekt, um einen Namensraum zu schaffen: Namensräume kommen in diversen Zusammenhängen vor und sind im Allgemeinen benannte Bereiche, in denen sich Dateneinheiten verschiedener Art befinden können, sowie Unter-Namensräume. Durch die Zuordnung zu einem Namensraum können Dateneinheiten in unterschiedlichen Namensräumen den gleichen Namen tragen. Insofern sind Namensräume einfach eine Organisationsmethode.

Ein Beispiel ist euer Dateisystem. Ihr legt eine Datei in einem Ordner ab.

/Dokumente/Abschlussarbeit/Ideen.txt

Dadurch dass Ideen.txt im Ordner Abschlussarbeiten liegt, kann es in einem anderen Ordner eine Datei mit gleichem Namen geben, ohne dass es zu Namenskonflikten kommt.

/Dokumente/Meine Webseite/Ideen.txt

Die beiden Ordner Abschlussarbeit und Meine Webseite stellen hierbei Namensräume dar. Sie sind wiederum dem Namensraum Dokumente untergeordnet.
Gäbe es die Namensräume nicht, dann würden alle Dateien des Computers in ein- und demselben Verzeichnis liegen. Es dürften keine zwei Dateien namens Ideen.txt existieren. Jede Datei müsste anders benannt sein. Es gäbe auf die Dauer ein Namens-Chaos. Und da alle Dateien auf der gleichen Ebene lägen, wäre es auch schwierig, eine Datei zu finden, wenn sie mal gebraucht wird.

In der Programmierung verhält es sich genauso mit Variablen, Objekten, Funktionen und anderen benannten Einheiten. Auch hier wird durch die Organisation in Namensräume Struktur geschaffen.

Genau das ist, wozu das Math-Objekt da ist: Damit nicht Konstanten wie PI und Methoden wie min, max und random im globalen Geltungsbereich verstreut sind, sondern im Math-Objekt gebündelt.

Programmierkonventionen

Die festen Werte, die im Math-Objekt hinterlegt sind – wie bspw. Pi, die eulerische Zahl, der Logarithmus von ℇ zur Basis 10 – sind allesamt großgeschrieben.

Math.PI
// => 3.141592653589793
Math.E
// => 2.718281828459045
Math.LOG10E
// => 0.4342944819032518

Damit wird markiert, dass es sich hierbei um Konstanten handelt, also Werte, die konstant sind und sich nicht verändern.

Konstanten werden in der Programmierung per Konvention in vielen Sprachen groß geschrieben. Das bedeutet, dass die Großschreibung sich nicht aus einer technischen Notwendigkeit ergibt, sondern aus einer Abmachung der beteiligten Entwickler. Konventionen gibt es viele in der Programmierung. Sie machen Programmcode konsistent, was u.a. der Struktur und Lesbarkeit dient.

Konventionen zeigen euch bereits an dieser Stelle: In der Programmierung geht es nicht nur darum, etwas technisch umzusetzen. Vielmehr stellt sich die Frage, wie etwas umgesetzt wird. Je tiefer ihr in die Materie einsteigt, desto mehr werdet ihr euch Gedanken darüber machen, wie ihr euer Programm und vor allem auch euren Entwicklungsprozess und ggf. euer Team organisiert.
Zu lernen, etwas irgendwie umzusetzen, ist nur der allererste Schritt in der Laufbahn eines Entwicklers. Zu lernen, es bestmöglich umzusetzen, dagegen eine immerwährende Herausforderung.